擴(kuò)展為現(xiàn)有的類、結(jié)構(gòu)體、枚舉類型、或協(xié)議添加了新功能
擴(kuò)展和 Objective-C 中的分類類似。(與 Objective-C 的分類不同的是,Swift 的擴(kuò)展沒(méi)有名字。)
Swift 中的擴(kuò)展可以:
- 添加計(jì)算實(shí)例屬性和計(jì)算類型屬性;
- 定義實(shí)例方法和類型方法;
- 提供新初始化器;
- 定義下標(biāo);
- 定義和使用新內(nèi)嵌類型;
- 使現(xiàn)有的類型遵循某協(xié)議
extension 關(guān)鍵字來(lái)聲明擴(kuò)展:
extension SomeType {
//
//
}
擴(kuò)展可以使已有的類型遵循一個(gè)或多個(gè)協(xié)議。在這種情況下,協(xié)議名的書(shū)寫方式與類或結(jié)構(gòu)體完全一樣:
extension SomeType: SomeProtocol, AnotherProtocol {
// implementation of protocol requirements goes here
}
擴(kuò)展可以為已有的類型添加新的實(shí)例方法和類型方法。下面的例子為 Int 類型添加了一個(gè)名為 repetitions 的新實(shí)例方法:
extension Int {
func repetitions(task: () -> Void) {
for _ in 0..<self {
task()
}
}
}
repetitions(task:) 方法接收一個(gè) () -> Void 類型的單一實(shí)際參數(shù),它表示一個(gè)沒(méi)有參數(shù)且無(wú)返回值的函數(shù)。
3.repetitions {
print("Hello!")
}
// Hello!
// Hello!
// Hello!
增加了擴(kuò)展的實(shí)例方法仍可以修改(或異變)實(shí)例本身。結(jié)構(gòu)體和枚舉類型方法在修改 self 或本身的屬性時(shí)必須標(biāo)記實(shí)例方法為 mutating ,和原本實(shí)現(xiàn)的異變方法一樣。
extension Int {
mutating func square() {
self = self * self
}
}
var someInt = 3
someInt.square()
// someInt is now 9
下標(biāo)
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
746381295[0]
// returns 5
746381295[1]
// returns 9
746381295[2]
// returns 2
746381295[8]
// returns 7