extension
- 擴展為現(xiàn)有的類、結(jié)構(gòu)體勿她、枚舉類型、協(xié)議添加了新功能阵翎。這也包括了為無訪問權(quán)限的源代碼擴展類型的能力(所謂的逆向建模)逢并。
- 擴展和 OC 中的 category 類似(不同之處在于:Swift 的擴展沒有名字)之剧。
extension 的能力
- 添加計算實例屬性和計算類型屬性;【不能添加存儲屬性】
- 定義實例方法和類型方法砍聊;
- 提供新初始化器背稼;
- 定義下標(biāo);
- 定義和使用新內(nèi)嵌類型玻蝌;
- 使現(xiàn)有的類型遵循某協(xié)議蟹肘;
- 擴展可以向一個類型添加新的方法,但是不能重寫已有的方法俯树×备梗【OC 中的 category 可以覆蓋掉已有的方法】
計算屬性
- 擴展可以向已有的類型添加計算實例屬性和計算類型屬性。
初始化器
- 擴展可以向已有的類型添加新的初始化器许饿,這允許你擴展其他類型以使初始化器接收你的自定義類型作為形式參數(shù)阳欲,或提供該類型的原始實現(xiàn)中未包含的額外初始化選項。
- 擴展能為類型添加新的便捷初始化器陋率,但是不能為類型加指定初始化器胸完。指定初始化器和反初始化器 必須由原來類的實現(xiàn)提供。
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
}
extension Rect {
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0))
方法
- 擴展可以為已有的類型添加新的實例方法和類型方法翘贮。
extension Int {
func repetitions(task:() -> Void) {
for _ in 0..<self {
task()
}
}
}
3.repetitions {
print("hello")
}
執(zhí)行結(jié)果如下:
hello
hello
hello
mutating 方法
- 擴展的實例方法仍可以修改(或異變)實例本身赊窥。結(jié)構(gòu)體和枚舉類型方法在修改 self 或本身的屬性時必須標(biāo)記實例方法為 mutating,和原本是險惡異變方法一樣狸页。
extension Int {
mutating func square() {
self = self * self
}
}
var someInt = 3
someInt.square()
print("\(someInt)")
執(zhí)行結(jié)果如下:
9
下標(biāo)
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
print("\((self / decimalBase) % 10)")
return (self / decimalBase) % 10
}
}
746381295[0]
746381295[1]
746381295[2]
746381295[8]
執(zhí)行結(jié)果如下:
5
9
2
7
添加內(nèi)嵌類型
- 擴展可以為已有的類锨能、結(jié)構(gòu)體和枚舉類型添加新的內(nèi)嵌類型
extension Int {
enum Kind {
case negative, zero, positive
}
var kind: Kind {
switch self {
case 0:
return .zero
case let x where x > 0 :
return .positive
default:
return .negative
}
}
}