关联对象




关联对象(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




【从OC到Swift】




©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容