擴展就是向一個已有的類、結構體或枚舉類型添加新功能,包含屬性和方法,若是你定義了一個擴展向一個已有類型添加新功能,那麼這個新功能對該類型的全部已有實例中都是可用的,即便它們是在你的這個擴展的前面定義的。函數
擴展語法spa
使用關鍵extension來聲明一個擴展,在extension後面加類型名稱code
extension SomeType {
}
一個擴展能夠擴展一個已有類型,使其可以適配一個或多個協議(protocol)。當這種狀況發生時,接口的名字應該徹底按照類或結構體的名字的方式進行書寫:server
extension SomeType: SomeProtocol, AnotherProctocol {
}
計算屬性的擴展blog
extension Double { var km: Double { return self * 1_000.0 } var m: Double { return self } var cm: Double { return self / 100.0 } var mm: Double { return self / 1_000.0 } var ft: Double { return self / 3.28084 } } let oneInch = 25.4.mm print("One inch is \(oneInch) meters") // Prints "One inch is 0.0254 meters" let threeFeet = 3.ft print("Three feet is \(threeFeet) meters") // Prints "Three feet is 0.914399970739201 meters
注意:擴展能夠添加新的計算屬性,可是不能夠添加存儲屬性,也不能夠向已有屬性添加屬性觀測器(property observers)。接口
構造方法three
擴展能夠向已有類型添加新的構造器。這能夠讓你擴展其它類型,將你本身的定製類型做爲構造器參數,或者提供該類型的原始實現中沒有包含的額外初始化選項。it
注意:若是你使用擴展向一個值類型添加一個構造器,該構造器向全部的存儲屬性提供默認值,並且沒有定義任何定製構造器(custom initializers),那麼對於來自你的擴展構造器中的值類型,你能夠調用默認構造器(default initializers)和成員級構造器(memberwise initializers)。 正如在值類型的構造器受權中描述的,若是你已經把構造器寫成值類型原始實現的一部分,上述規則再也不適用。io
方法的擴展class
extension Int { func repetitions(task: () -> ()) { for i in 0..self { task() } } }
這個repetitions方法使用了一個() -> ()類型的單參數(single argument),代表函數沒有參數並且沒有返回值。
定義該擴展以後,你就能夠對任意整數調用repetitions方法,實現的功能則是屢次執行某任務:
3.repetitions{ println("Goodbye!") } // Goodbye! // Goodbye! // Goodbye!