关联对象(Associated Object)
- 在Swift中
class
依然可以使用关联对象,结构体和枚举是不可以使用关联对象的。 - 默认情况下
extension
不可以增加存储属性(因为修改了类的内存结构),借助关联对象,可以实现类似extension为class增加存储属性的效果。
import Foundation
class Person {}
extension Person {
//使⽤void?可选类型,只占⼀个字节,省内存啊
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