變數引數

有時,無法列出函式可能需要的引數數量。考慮一個 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