前言
擴展就是向一個已有的類、結構體或枚舉類型添加新功能。
擴展可以對一個類型添加新的功能,但是不能重寫已有的功能。
基本語法
使用 extension 關鍵字聲明擴展:
extension SomeType {
// 在這裏給 SomeType 添加新的功能
}
擴展可以擴充一個現有的類型,給它添加一個或多個協議。協議名稱的寫法和類或者結構體一樣:
extension SomeType: SomeProtocol, AnotherProtocol {
// 協議所需要的實現寫在這裏
}
計算型屬性
擴展可以向已有類型添加計算型實例屬性和計算型類型屬性。
官方例子:
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.add
print("加法運算後的值:\(addition)")
let subtraction = 120.sub
print("減法運算後的值:\(subtraction)")
let multiplication = 39.mul
print("乘法運算後的值:\(multiplication)")
let division = 55.div
print("除法運算後的值: \(division)")
let mix = 30.add + 34.sub
print("混合運算結果:\(mix)")
注意:擴展可以添加新的計算屬性,但是它們不能添加存儲屬性,或向現有的屬性添加屬性觀察者。
構造器
擴展可以向已有類型添加新的構造器。
這可以讓你擴展其它類型,將你自己的定製類型作爲構造器參數,或者提供該類型的原始實現中沒有包含的額外初始化選項。
擴展可以向類中添加新的便利構造器 init(),但是它們不能向類中添加新的指定構造器或析構函數 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)")
注意:如果你通過擴展提供一個新的構造器,你有責任確保每個通過該構造器創建的實例都是初始化完整的。
方法
擴展可以向已有類型添加新的實例方法和類型方法。
下面的例子向Int類型添加一個名爲 topics 的新實例方法:
extension Int {
func topics(summation: () -> ()) {
for _ in 0..<self {
summation()
}
}
}
4.topics({
print("擴展模塊內")
})
3.topics({
print("內型轉換模塊內")
})
這個topics方法使用了一個() -> ()類型的單參數,表明函數沒有參數而且沒有返回值。
定義該擴展之後,你就可以對任意整數調用 topics 方法,實現的功能則是多次執行某任務
可變實例方法
通過擴展添加的實例方法也可以修改該實例本身。
結構體和枚舉類型中修改self或其屬性的方法必須將該實例方法標註爲mutating,正如來自原始實現的修改方法一樣。
下面的例子向 Swift 的 Double 類型添加了一個新的名爲 square 的修改方法,來實現一個原始值的平方計算:
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)")
下標
擴展可以向一個已有類型添加新下標。
以下例子向 Swift 內建類型Int添加了一個整型下標。該下標[n]返回十進制數字
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])
嵌套類型
擴展可以向已有的類、結構體和枚舉添加新的嵌套類型:
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])
本篇來源,菜鳥教程。