iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0

擴展

擴展可以给一个現有的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()

需要注意的是,如果使用擴展使某個資料型態遵守一個在定,在此擴展就需要實現協定中的方法

接下來,是協定的介紹


上一篇
Day25 Swift 泛型
下一篇
Day27 Swift 協定
系列文
初入Swift新手村的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言