变量参数

有时,无法列出函数可能需要的参数数量。考虑一个 sum 函数:

func sum(_ a: Int, _ b: Int) -> Int {
    return a + b
}

这适用于查找两个数字的总和,但是为了找到三个的总和,我们必须编写另一个函数:

func sum(_ a: Int, _ b: Int, _ c: Int) -> Int {
    return a + b + c
}

一个有四个参数需要另外一个,依此类推。Swift 可以使用三个周期的序列来定义具有可变数量参数的函数:...。例如,

func sum(_ numbers: Int...) -> Int {
    return numbers.reduce(0, combine: +)
}

请注意 numbers 参数(可变参数)如何合并为 [Int] 类型的单个 Array。通常情况下,T... 类型的可变参数可以作为 [T] 访问。

现在可以像这样调用此函数:

let a = sum(1, 2) // a == 3
let b = sum(3, 4, 5, 6, 7) // b == 25

Swift 中的可变参数不必位于参数列表的末尾,但每个函数签名中只能有一个参数。

有时,在参数数量上设置最小尺寸很方便。例如,采用没有值的 sum 真的没有意义。一种简单的方法是强制执行此操作,方法是添加一些非变量的必需参数,然后再添加 variadic 参数。为了确保只能使用至少两个参数调用 sum,我们可以编写

func sum(_ n1: Int, _ n2: Int, _ numbers: Int...) -> Int {
    return numbers.reduce(n1 + n2, combine: +)
}

sum(1, 2) // ok
sum(3, 4, 5, 6, 7) // ok
sum(1) // not ok
sum() // not ok