将数组传递给一个具有可变数目的参数的函数

在Swift编程语言中 ,它说:

函数还可以获取可变数量的参数,将其收集到一个数组中。

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

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

问题:如果我已经有一些我想要传递给这个函数的数字呢?

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

这会因为编译器错误而失败,“无法find接受所提供参数的__conversion重载”。 有没有办法将一个现有的数组转换为我可以传递给可变参数函数的元素列表?

Splatting目前还不是语言 ,正如开发者所确认的那样。 现在的解决方法是使用重载或等待,如果你不能添加重载。

这是我发现的一个工作。 我知道这不完全是你想要的,但它似乎工作。

第1步:用数组而不是可变参数声明你想要的函数:

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

第2步:从你的可变参数函数中调用它:

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

第三步:打电话:

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

这似乎很奇怪,但它在我的testing工作。 让我知道这是否会导致任何人无法预料的问题。 Swift似乎能够用相同的函数名称来区分这两个调用之间的区别。

此外,如果苹果公司更新了语言@ manojid的答案build议,你只需要更新这些function。 否则,你将不得不通过并做大量的重命名。

你可以像这样使用一个辅助函数:

 func sumOf (numbers : [Int]) -> Int { return numbers.reduce(0, combine: +) } func sumOf (numbers : Int...) -> Int { return sumArray (numbers) } 

你可以施放这个function:

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

我知道这个回答并不能回答你确切的问题,但我觉得值得注意。 我也开始玩Swift,并立即遇到类似的问题。 Manojlds的回答对你的问题更好,我同意,但是又一次,我提出了另一个解决方法。 我也喜欢Logan的更好。

在我的情况下,我只是想传递一个数组:

 func sumOf(numbers: Array<Int>) -> Int { var sum = 0 for number in numbers { sum += number } return sum } var someNums = [8,7,2,9,12] sumOf(someNums) sumOf([10, 15, 20]) 

只是想分享,以防其他人像我一样思考。 大多数情况下,我宁愿通过这样的arrays,但我不认为“迅速”呢。 🙂

我做了这个(Wrapper + Identity Mapping):

 func addBarButtonItems(types: REWEBarButtonItemType...) { addBarButtonItems(types: types.map { $0 }) } func addBarButtonItems(types: [REWEBarButtonItemType]) { // actual implementation } 

我使用inout传递数组来运行。

obstacleUnlockArray是我的公共variables。 我通常有多个公共variables。

 unlock(unlockArray: &obstacleUnlockArray) func unlock(unlockArray:inout [Int]) { // modify array unlockArray.append(1) }