在The Swift Programming Language,它说:
函数也可以采用可变数量的参数,将它们收集到一个数组中。
func sumOf(numbers: Int...) -> Int { ... }
当我用逗号分隔的数字列表(`sumOf(1,2,3,4))调用这样的函数时,它们可以作为函数内的数组使用。
问:如果我已经有一个数字数组要传递给这个函数怎么办?
let numbers = [1, 2, 3, 4]
sumOf(numbers)
这会因编译器错误而失败,“无法找到接受所提供参数的'__conversion'的重载”。有没有办法将现有数组转换为可以传递给可变函数的元素列表?
Splatting is not in the language yet,开发者证实。现在的解决方法是使用重载或等待,如果您不能添加重载。
这是我发现的一项工作。我知道这不是你想要的,但似乎有效。
第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)
}
第3步:呼叫任何一种方式:
var variadicSum = sumOf(1, 2, 3, 4, 5)
var arraySum = sumOf([1, 2, 3, 4, 5])
这看起来很奇怪,但它在我的测试中起作用。如果这会导致任何人无法预料的问题,请告诉我。 Swift似乎能够用相同的函数名来区分两个调用之间的差异。
此外,使用此方法,如果Apple更新语言@ manojid的答案建议,您只需要更新这些功能。否则,您将不得不经历并进行大量重命名。
你可以施放这个功能:
typealias Function = [Int] -> Int
let sumOfArray = unsafeBitCast(sumOf, Function.self)
sumOfArray([1, 2, 3])
您可以使用辅助函数:
func sumOf (numbers : [Int]) -> Int { return numbers.reduce(0, combine: +) }
func sumOf (numbers : Int...) -> Int { return sumArray (numbers) }
我知道这个回答并没有回答你的确切问题,但我觉得值得注意。我也开始玩Swift并立即遇到类似的问题。 Manojlds的回答对你的问题更好,我同意,但同样,我提出了另一种解决方法。我碰巧也喜欢洛根更好。
在我的情况下,我只是想传递一个数组:
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])
只是想分享,以防其他人像我一样思考。大多数时候我更喜欢像这样传递数组,但我不认为“迅速”。 :)
我做了这个(包装+身份映射):
func addBarButtonItems(types: REWEBarButtonItemType...) {
addBarButtonItems(types: types.map { $0 })
}
func addBarButtonItems(types: [REWEBarButtonItemType]) {
// actual implementation
}
• 在 laravel 控制器中使用全局变量在另一个函数中调用函数
• 在 Python 中计算参数、参数、将变量传递给函数时遇到问题
• Flutter:将带参数的函数传递给类构造函数中的 VoidCallback
• 在 raect js 中,我该怎么做,修复 React 代码以在组件之间传递数据
• 在 MASM 中将 [常量] 传递给函数的正确解释是什么?
• 如何读取传递给使用 googlemock 模拟的方法的数组指针的内容?
• Swift 使用带有范围的 randomElement() 函数
• 如何从 JavaScript 将动态百分比传递给 CSS 变量?
• 如何将变量的名称从 `purrr::map()` 传递给自定义函数?
• 错误:函数不能直接传递给客户端组件,除非您通过标记为“使用服务器”来显式公开它
• 为什么这个 SwiftUI 状态在作为非绑定参数传递时没有更新?