Passing an array to a function with variable number of args in Swift
在Swift编程语言中,它表示:
Functions can also take a variable number of arguments, collecting them into an array.
1
2
3 func sumOf(numbers: Int...) -> Int {
...
}
号
当我用逗号分隔的数字列表(`sumof(1,2,3,4)调用这样的函数时,它们作为函数内的数组提供。
问题:如果我已经有了一个要传递给这个函数的数字数组怎么办?
1 2 | let numbers = [1, 2, 3, 4] sumOf(numbers) |
此操作失败,出现编译器错误,"找不到接受所提供参数的"uu conversion"的重载"。有没有一种方法可以将现有数组转换为元素列表,我可以将其传递给变量函数?
据开发人员确认,喷溅还没有使用语言。现在的解决方法是使用重载,或者在无法添加重载时等待。
这是我找到的一份工作。我知道这不完全是你想要的,但它似乎在起作用。
步骤1:用数组而不是可变参数声明您想要的函数:
1 2 3 4 5 6 7 | func sumOf(numbers: [Int]) -> Int { var total = 0 for i in numbers { total += i } return total } |
号
第2步:在variadic函数中调用它:
1 2 3 | func sumOf(numbers: Int...) -> Int { return sumOf(numbers) } |
第3步:任意呼叫:
1 2 | var variadicSum = sumOf(1, 2, 3, 4, 5) var arraySum = sumOf([1, 2, 3, 4, 5]) |
。
这看起来很奇怪,但它在我的测试中起作用。如果这会给任何人带来不可预见的问题,请告诉我。Swift似乎能够区分具有相同函数名的两个调用之间的差异。
此外,如果苹果按照@manojid的回答建议更新语言,那么您只需要更新这些函数。否则,您将不得不进行大量的重命名。
您可以强制转换函数:
1 2 3 | typealias Function = [Int] -> Int let sumOfArray = unsafeBitCast(sumOf, Function.self) sumOfArray([1, 2, 3]) |
。
您可以使用helper函数,例如:
1 2 | func sumOf (numbers : [Int]) -> Int { return numbers.reduce(0, combine: +) } func sumOf (numbers : Int...) -> Int { return sumOf (numbers) } |
我这样做了(包装+身份映射):
1 2 3 4 5 6 7 | func addBarButtonItems(types: REWEBarButtonItemType...) { addBarButtonItems(types: types.map { $0 }) } func addBarButtonItems(types: [REWEBarButtonItemType]) { // actual implementation } |
。
我知道这个回答不能回答你确切的问题,但我觉得值得注意。我也开始和斯威夫特玩了,然后立刻遇到了一个类似的问题。Manojlds的回答更适合你的问题,我同意,但我再次提出了另一个解决方法。我也更喜欢洛根。
在我的例子中,我只想传递一个数组:
1 2 3 4 5 6 7 8 9 10 11 | 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]) |
只是想分享,以防其他人像我一样思考。大多数时候我更喜欢像这样传递数组,但我还不认为是"快速"的。:)