關(guān)聯(lián)對象(Associated Object)
- 在Swift中
class
依然可以使用關(guān)聯(lián)對象,結(jié)構(gòu)體和枚舉是不可以使用關(guān)聯(lián)對象的纲岭。 - 默認(rèn)情況下
extension
不可以增加存儲屬性(因?yàn)樾薷牧祟惖膬?nèi)存結(jié)構(gòu))篮赢,借助關(guān)聯(lián)對象炬太,可以實(shí)現(xiàn)類似extension為class增加存儲屬性的效果魂务。
import Foundation
class Person {}
extension Person {
//使?void?可選類型炎疆,只占?個字節(jié)奉瘤,省內(nèi)存啊
private static var AGE_KEY: Void?
//private static var WEIGHT_KEY = false
var age: Int {
get {
(objc_getAssociatedObject(self, &Self.AGE_KEY) as? Int) ?? 0
}
set {
//第?個key是對象本身勾拉,第?個key是&Self.AGE_KEY,通過這兩個Key找到存儲的值
// &Self.AGE_KEY:取出newValues的地址值
// newValue:就是外?傳的值
objc_setAssociatedObject(self, &Self.AGE_KEY, newValue, .OBJC_ASSOCIATION_ASSIGN)
}
}
}
var p = Person()
print(p.age) // 0
p.age = 10
print(p.age) // 10