Swift 中為一個擴展添加實例變量

眾所周知,在擴展中是不能為其添加實例變量的,那么如果非要加一個實例變量呢?我們可以用property配合Associated Object的方式,將一個對象關(guān)聯(lián)到已有的要擴展的類上。

class MyClass {}

private var key: Void?

extension MyClass {
  
    var title: String? {
        get {
            return objc_getAssociatedObject(self, &key) as? String
        }
        set {
            objc_setAssociatedObject(self, &key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

let my = MyClass()
my.title // nil

my.title = "Hello"
my.title // Hello

key 的類型在這里聲明為了 Void?,并且通過 & 操作符取地址并作為 UnsafePointer<Void> 類型被傳入。這在 Swift 與 C 協(xié)作和指針操作時是一種很常見的用法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容