我想制作一个可以采用可变数量参数的方法。有点像在javascript中,我可以使用函数内的arguments
关键字获取所有参数。我怎么能在Swift中做到这一点?
我的主要目的是允许所有重载的构造函数转到一个方法,即使它根本没有传递参数。
class Counter {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes: Int) {
count += amount * numberOfTimes
}
}
答案 0 :(得分:15)
在Swift iBook中有一个例子,第17页:
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
sumOf() // returns 0
sumOf(1,2) // returns 3
sumOf(42, 597, 12) // returns 651
答案 1 :(得分:14)
Varargs很棒,但它们并不是真正用于表示不同内容的可选参数,如问题中的Counter
示例所示。但是,函数重载可能有点过分:它打破了函数定义与其真实实现之间的耦合。
您可能需要的是参数的默认值:
func incrementBy(amount: Int, numberOfTimes num: Int = 1) {
count += amount * num
}
现在,您可以调用incrementBy(2, numberOfTimes:1)
或incrementBy(2)
(递增2,一次)。
具有默认值的参数必须位于func / method签名的最后,并且必须标记。本书讨论了Function Parameter Names下的几个小节。
答案 2 :(得分:3)
他们称他们为Swift中的Variadic参数,符号如下:
func aFunction(args: String...) {
println(args[0])
// do other stuff
}
aFunction("something", "something else")
我在这里给参数命名为“args”,但这不是语法的一部分,它可以被称为你想要的。重要的部分是尾随期(......)。您可以通过下标访问各个参数。
更多信息可在第227页的The Swift Programming Language中找到。
答案 3 :(得分:2)
你可以在Swift中重载函数。
func test(amount: Int) {
test(amount, nil)
}
func test(amount: Int, name: String?) {
println("Amount: \(amount)")
if let name = name {
println("Name: \(name)")
}
}
test(1, "Leandros")
test(1)
此示例将打印:
Amount: 1
Name: Leandros
Amount: 1