擴展可以给一个現有的class,struct,enum,添加新的功能。它還擁有不需要訪問被擴展類型源程式碼就能完成擴展的能力。
// 建立一個類,有兩個屬性
class MyClass{
var name:String = "andy"
var age:Int
init() {
name = "哈哈"
age = 23
}
}
// 给MyClass进行擴展
extension MyClass {
// 擴展計算屬性
var nameAndage :String{
return "\(name) + \(age)"
}
}
var obj = MyClass()
obj.nameAndage
上面的演示了透過擴展為類新增計算屬性。同樣,也可以為類型新增一個構造方法
// 给MyClass进行擴展
extension MyClass {
// 擴展計算屬性
var nameAndAge :String{
return "\(name) + 5"
}
convenience init(name:String) {
self.init()
self.name = name
}
}
var obj2 = MyClass(name: "andy")
也可以透過擴展添加實例方法與類方法
extension MyClass {
// 擴展一個實例方法
func logName(){
name = "是我"
print(name)
}
// 擴展一個類方法
class func logClassName(){
print("MyClass3")
}
}
var c3 = MyClass()
c3.nameAndAge
c3.logName()
有一點需要注意,如果是對值類型進行擴展,可以使用mutatimg關鍵字來修飾方法,使得在方法內部可以直接修改當前實例本身
extension Int{
// 修改本身需要使用mutating
mutating func change(){
self = self*self
}
}
var r :Int = 9
r.change()
print(r)
可以使用擴展來使某個類遵守一個協定
// 定義一個協定
protocol MyProtocol {
func myFunc();
}
// 使用擴展使類型遵守某個協定
extension MyClass:MyProtocol {
// 必須對協定中的方法進行實現
func myFunc() {
print("myFunc")
}
}
var cls = MyClass()
cls.myFunc()
需要注意的是,如果使用擴展使某個資料型態遵守一個在定,在此擴展就需要實現協定中的方法
接下來,是協定的介紹