關聯(lián)對象(Associated Object)
- 在Swift中
class依然可以使用關聯(lián)對象,結構體和枚舉是不可以使用關聯(lián)對象的。 - 默認情況下
extension不可以增加存儲屬性(因為修改了類的內(nèi)存結構),借助關聯(lián)對象,可以實現(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