軌道
/
Swift
Swift
/
課程大綱
/
函式多載
函式

函式多載 在 Swift

1 個練習

關於 函式多載

在 Swift 中,只要簽章不同,你就可以定義多個同名函式。這種做法稱為函式多載。

請看以下這個基礎函式:

func add(_ x: Int, and y: Int, doubleResult: Bool) -> Int {
    let sum = x + y
    return doubleResult ? sum * 2 : sum
}

let twentySix = add(6, and: 7, doubleResult: true)
// => 26

在 Swift 中,只要符合下列任一條件,兩個同名函式就會被視為不同的函式:

  • 參數數量不同。
  • 外部引數標籤不同。
  • 參數型別不同。
  • 回傳型別不同(前提是呼叫的上下文能明確指出該用哪一個)。

以剛才的add函式為基準,下列每個多載版本都是不同的函式,而且可以在同一個程式中並存:

// 1. Different number of parameters
func add(_ x: Int, and y: Int) -> Int {
    x + y
}

let eleven = add(5, and: 6)
// => 11

// 2. Different parameter type (Double instead of Int)
func add(_ x: Double, and y: Int, doubleResult: Bool) -> Double {
    let sum = x + Double(y)
    return doubleResult ? sum * 2 : sum
}

let twentySeven = add(6.5, and: 7, doubleResult: true)
// => 27.0

// 3. Different argument label (doubleThat instead of doubleResult)
func add(_ x: Int, and y: Int, doubleThat: Bool) -> Int {
    let sum = x + y
    return doubleThat ? sum * 2 : sum
}

let thirteen = add(6, and: 7, doubleThat: false)
// => 13

依回傳型別多載

函式也可以只靠回傳型別來多載。 不過,呼叫這類函式時,你必須提供型別標註或上下文,編譯器才知道你指的是哪個多載版本:

func add(_ x: Int, and y: Int, doubleResult: Bool) -> Double {
    let sum = Double(x + y)
    return doubleResult ? sum * 2 : sum
}

// Ambiguous call (compiler cannot decide whether you want Int or Double):
// let thirty = add(6, and: 9, doubleResult: true)

// Resolved with an explicit type annotation:
let thirty: Double = add(6, and: 9, doubleResult: true)
// => 30.0

無法區分多載的情況

只改變內部參數名稱,而沒有改動引數標籤、參數型別或參數數量,並不會產生一個不同的函式。 編譯器會將這種情況視為無效的重複宣告:

func add(_ w: Int, and y: Int, doubleResult: Bool) -> Int {
    let sum = w + y
    return doubleResult ? sum * 2 : sum
}
// Error: Invalid redeclaration of 'add(_:and:doubleResult:)'
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 函式多載