提问者:小点点

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


在Swift编程语言中,它说:

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

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

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

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

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

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


共3个答案

匿名用户

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

匿名用户

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

步骤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的答案更新语言,那么使用这种方法,您只需要更新这些函数。否则,您将不得不经历并进行大量的重命名。

匿名用户

您可以强制转换函数:

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