当前位置: 首页 > 知识库问答 >
问题:

在Swift中将数组传递给参数数可变的函数

经兴安
2023-03-14

在Swift编程语言中,它说:

函数也可以接受可变数目的参数,将它们收集到数组中。

  func sumOf(numbers: Int...) -> Int {
      ...
  }

当我用逗号分隔的数字列表(`sumof(1,2,3,4)调用这样一个函数时,它们在函数中作为一个数组可用。

问题:如果我已经有一个数组要传递给这个函数,该怎么办?

let numbers = [1, 2, 3, 4]
sumOf(numbers)

这将失败,并出现编译器错误,“无法找到接受所提供参数的'__conversion'的重载”。有没有办法把一个现有的数组变成一个我可以传递给一个变量函数的元素列表?

共有3个答案

佴德曜
2023-03-14

您可以强制转换函数:

typealias Function = [Int] -> Int
let sumOfArray = unsafeBitCast(sumOf, Function.self)
sumOfArray([1, 2, 3])
牟波
2023-03-14

这是我找到的一个工作。我知道这不完全是你想要的,但它似乎起作用了。

步骤1:使用数组而不是变量参数声明您想要的函数:

func sumOf(numbers: [Int]) -> Int {
    var total = 0
    for i in numbers {
        total += i
    }
    return total
}

步骤2:在variadic函数中调用此函数:

func sumOf(numbers: Int...) -> Int {
    return sumOf(numbers)
}

第三步:用任何一种方式打电话:

var variadicSum = sumOf(1, 2, 3, 4, 5)
var arraySum = sumOf([1, 2, 3, 4, 5])

这看起来很奇怪,但它在我的测试中起作用了。如果这对任何人造成不可预见的问题,请告诉我。Swift似乎能够将两个函数名相同的调用之间的区别分开。

此外,如果苹果按照@Manojid的答案更新语言,那么使用这种方法,您只需要更新这些函数。否则,您将不得不经历并进行大量的重命名。

孙琨
2023-03-14

正如开发人员所证实的那样,Splatting还没有出现在语言中。现在的解决办法是使用重载或等待,如果您不能添加重载。

 类似资料:
  • 问题内容: 在Swift编程语言中,它说: 函数也可以采用可变数量的参数,将它们收集到一个数组中。 当我用逗号分隔的数字列表(`sumOf(1、2、3、4)调用这样的函数时,它们可以作为函数内部的数组使用。 问题:如果我已经有一个要传递给该函数的数字数组怎么办? 这将因编译器错误而失败,即“找不到接受提供的参数的’__conversion’的重载”。有没有办法将现有数组转换为可以传递给可变参数函数

  • 问题内容: 为了不重复我的自我,我想创建一个函数来处理一些命令。 一旦我尝试运行它,我得到以下错误: 我研究了的实现,并且看起来函数签名正是我提供的。 在内部a 应该与可变参数相同,但对于编译器来说似乎不一样。 有没有办法将可变参数传递给? 问题答案: 您用另一个扩展 从语言规范的传递参数…参数 如果最终参数可分配给切片类型,则在参数后跟时可以将其作为参数的值原样传递。在这种情况下,不会创建新的切

  • 问题内容: 我有一个PHP函数,该函数需要可变数量的参数(使用和),但是我要传递给该函数的参数数量取决于数组的长度。有没有一种方法可以使用可变数量的参数来 调用 PHP函数? 问题答案: 如果参数在数组中,则该函数可能会对您有兴趣。 如果您要传递的参数数量取决于数组的长度,则可能意味着您可以将它们自己打包到数组中-并将其用于第二个参数。 然后,您传递给该数组的元素将作为不同的参数被函数接收。 例如

  • 问题内容: 与在或中使用的方式类似: 问题答案: 是。 如果你不理会关键字参数,这很简单并且可以工作: 如你所见,Python将为你提供一个包含所有参数的元组。 对于关键字参数,你需要将其作为单独的实际参数接受,如的所示。

  • 问题内容: 我有一个充满元素的arrayList。我想将该数组列表的元素作为参数传递给可变参数函数。 我的功能 我的ArrayList 我想将其传递给函数,就像我单独传递它们一样。 这样的事情可能吗? 提前致谢。 问题答案: 做就是了: 它将复制到给定的数组并返回它。所有vararg函数也可以为该参数采用数组,因此适用于: 所有合法电话为: 一个警告: 涉及原始数组的Vararg调用无法正常工作。

  • 我最近开始学习Swift,遇到了一个关于闭包的问题。我试图将开车的参数传递给func travel并收到错误消息:无法将类型'()'的值转换为预期的参数类型'()- 有人能善意地建议吗?赞赏!