Swift 擴展 (Extensions)

擴展 (Extension) 就是為現有的類別、結構、列舉或協定型別,添加新功能。

即便你沒有該型別的原始程式碼 (例如是 Apple 的內建型別 Int 或第三方庫的類別),你依然可以擴展它。這類似於 Objective-C 的 Category。

擴展能做什麼?

  • 添加計算屬性 (Computed Properties)
  • 添加方法 (Instance / Type Methods)
  • 添加新的建構器 (Initializers)
  • 定義並使用新的巢狀型別 (Nested Types)
  • 讓現有型別遵循某個協定 (Conform to Protocols)
注意:擴展不能添加新的儲存屬性 (Stored Properties)。

語法

使用 extension 關鍵字:

extension Double {
    var km: Double { return self * 1_000.0 }
    var m: Double { return self }
    var cm: Double { return self / 100.0 }
}

let threeFeet = 91.44.cm
print("三英尺是 \(threeFeet) 公尺")

為方法擴展

extension Int {
    func repetitions(task: () -> Void) {
        for _ in 0..<self {
            task()
        }
    }
}

3.repetitions {
    print("Hello!")
}
// 輸出三次 Hello!

透過擴展遵循協定

這是保持程式碼整潔的好習慣。你可以將「遵循某協定」的相關實作代碼,單獨放在一個 Extension 中,而不是全部擠在主要的 Class 定義裡。

struct Employee {
    var name: String
}

extension Employee: CustomStringConvertible {
    var description: String {
        return "員工姓名:\(name)"
    }
}