Swift方法中的可变参数个数

时间:2014-06-03 02:14:02

标签: swift

我想制作一个可以采用可变数量参数的方法。有点像在javascript中,我可以使用函数内的arguments关键字获取所有参数。我怎么能在Swift中做到这一点?

我的主要目的是允许所有重载的构造函数转到一个方法,即使它根本没有传递参数。

class Counter {
    var count: Int = 0
    func incrementBy(amount: Int, numberOfTimes: Int) {
        count += amount * numberOfTimes
    }
}

4 个答案:

答案 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