擴展就是向一個已有的類薪丁、結(jié)構(gòu)體或枚舉類型添加新功能遇西。擴展可以對一個類型添加新的功能粱檀,但是不能重寫已有的功能。Swift 中的擴展可以:添加計算型屬性和計算型靜態(tài)屬性定義實例方法和類型方法提供新的構(gòu)造器定義下標(biāo)定義和使用新的嵌套類型使一個已有類型符合某個協(xié)議語法擴展聲明使用關(guān)鍵字 extension:extension SomeType {? ? // 加到SomeType的新功能寫到這里}一個擴展可以擴展一個已有類型渗常,使其能夠適配一個或多個協(xié)議,語法格式如下:extension SomeType: SomeProtocol, AnotherProctocol {? ? // 協(xié)議實現(xiàn)寫到這里}計算型屬性擴展可以向已有類型添加計算型實例屬性和計算型類型屬性癌椿。實例下面的例子向 Int 類型添加了 5 個計算型實例屬性并擴展其功能:extension Int {? var add: Int {return self + 100 }? var sub: Int { return self - 10 }? var mul: Int { return self * 10 }? var div: Int { return self / 5 }}? ? let addition = 3.addprint("加法運算后的值:\(addition)")? ? let subtraction = 120.subprint("減法運算后的值:\(subtraction)")? ? let multiplication = 39.mulprint("乘法運算后的值:\(multiplication)")? ? let division = 55.divprint("除法運算后的值: \(division)")let mix = 30.add + 34.subprint("混合運算結(jié)果:\(mix)")以上程序執(zhí)行輸出結(jié)果為:加法運算后的值:103減法運算后的值:110乘法運算后的值:390除法運算后的值: 11混合運算結(jié)果:154構(gòu)造器擴展可以向已有類型添加新的構(gòu)造器送粱。這可以讓你擴展其它類型,將你自己的定制類型作為構(gòu)造器參數(shù)世舰,或者提供該類型的原始實現(xiàn)中沒有包含的額外初始化選項。擴展可以向類中添加新的便利構(gòu)造器 init()震蒋,但是它們不能向類中添加新的指定構(gòu)造器或析構(gòu)函數(shù) deinit() 。struct sum {? ? var num1 = 100, num2 = 200}struct diff {? ? var no1 = 200, no2 = 100}struct mult {? ? var a = sum()? ? var b = diff()}extension mult {? ? init(x: sum, y: diff) {? ? ? ? _ = x.num1 + x.num2? ? ? ? _ = y.no1 + y.no2? ? }}let a = sum(num1: 100, num2: 200)let b = diff(no1: 200, no2: 100)let getMult = mult(x: a, y: b)print("getMult sum\(getMult.a.num1, getMult.a.num2)")print("getMult diff\(getMult.b.no1, getMult.b.no2)")以上程序執(zhí)行輸出結(jié)果為:getMult sum(100, 200)getMult diff(200, 100)方法擴展可以向已有類型添加新的實例方法和類型方法。下面的例子向Int類型添加一個名為 topics 的新實例方法:extension Int {? func topics(summation: () -> ()) {? ? ? for _ in 0..()類型的單參數(shù)直砂,表明函數(shù)沒有參數(shù)而且沒有返回值。
定義該擴展之后洽蛀,你就可以對任意整數(shù)調(diào)用 topics 方法,實現(xiàn)的功能則是多次執(zhí)行某任務(wù):
可變實例方法
通過擴展添加的實例方法也可以修改該實例本身。
結(jié)構(gòu)體和枚舉類型中修改self或其屬性的方法必須將該實例方法標(biāo)注為mutating异赫,正如來自原始實現(xiàn)的修改方法一樣故爵。
實例
下面的例子向 Swift 的 Double 類型添加了一個新的名為 square 的修改方法,來實現(xiàn)一個原始值的平方計算:
extension Double {
mutating func square() {
let pi = 3.1415
self = pi * self * self
}
}
var Trial1 = 3.3
Trial1.square()
print("圓的面積為: \(Trial1)")
var Trial2 = 5.8
Trial2.square()
print("圓的面積為: \(Trial2)")
var Trial3 = 120.3
Trial3.square()
print("圓的面積為: \(Trial3)")
以上程序執(zhí)行輸出結(jié)果為:
圓的面積為: 34.210935
圓的面積為: 105.68006
圓的面積為: 45464.070735
下標(biāo)
擴展可以向一個已有類型添加新下標(biāo)。
實例
以下例子向 Swift 內(nèi)建類型Int添加了一個整型下標(biāo)费就。該下標(biāo)[n]返回十進制數(shù)字
extension Int {
subscript(var multtable: Int) -> Int {
var no1 = 1
while multtable > 0 {
no1 *= 10
--multtable
}
return (self / no1) % 10
}
}
print(12[0])
print(7869[1])
print(786543[2])
以上程序執(zhí)行輸出結(jié)果為:
2
6
5
嵌套類型
擴展可以向已有的類、結(jié)構(gòu)體和枚舉添加新的嵌套類型:
extension Int {
enum calc
{
case add
case sub
case mult
case div
case anything
}
var print: calc {
switch self
{
case 0:
return .add
case 1:
return .sub
case 2:
return .mult
case 3:
return .div
default:
return .anything
}
}
}
func result(numb: [Int]) {
for i in numb {
switch i.print {
case .add:
print(" 10 ")
case .sub:
print(" 20 ")
case .mult:
print(" 30 ")
case .div:
print(" 40 ")
default:
print(" 50 ")
}
}
}
result([0, 1, 2, 3, 4, 7])
以上程序執(zhí)行輸出結(jié)果為:
10
20
30
40
50
50