Swift學習:擴展(Extensions)
擴展就是為一個已有的類、結構體、枚舉類型或者協議類型添加新功能。這包括在沒有權限獲取原始源代碼的情況下擴展類型的能力(即 逆向建模)。擴展和 Objective-C 的分類類似。(與 Objective-C 不同的是,Swift 的擴展沒有名字。)
swift 中的擴展可以:
添加計算型屬性和計算型類型屬性
定義實例方法和類型方法
提供新的構造器
定義下標
定義和使用新的嵌套類型
使一個已有類型符合某個協議
在 swift 中,你甚至可以對協議進行擴展,提供協議要求的實現,或者添加額外的功能,從而可以讓符合協議的類型擁有這些功能。你可以從協議擴展中獲取更多的細節。
註意
擴展可以為一個類型添加新的功能,但是不能重寫已有的功能。
擴展語法
使用關鍵子 extension 來聲明擴展:
extension SomeType {
// 為 SomeType 添加的新功能寫在這裏
}
可以通過擴展來擴展一個已有類型,使其采納一個或多個協議。在這種情況下,無論是類還是結構體,協議名字的書寫方式都是一樣的。
extension SomeType: SomeProtocol,AnotherProtocol {
// 協議實現寫在這裏
}
通過這種方式添加協議一致性的詳細描述可參考擴展添加協議一致性。
註意:
如果你通過擴展為一個已有類型添加新功能,那麽新功能對該類型的所有已有實例都是可用的,即使它們是在這個擴展定義之前創建的。
計算型屬性
擴展可以為已有類型添加計算型實例屬性和計算型類型屬性。下面的例子為 swift 的內建 Double 類型添加了五個計算型實例屬性,從而提供與距離單位協作的基本支持:
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 inckh is \(oneInch) meters")
let threeFeet = 3.ft
print("Three feet is \(threeFeet) meters")
這些計算型屬性表達的含義是把一個 Double 值看作是某單位下的長度值。即使它們被實現為計算型屬性,但這些屬性的名字仍可緊接一個浮點型字面值,從而通過點語法來使用,並以此實現距離轉換。
Swift學習:擴展(Extensions)