美文网首页Swift
Swift之关联对象

Swift之关联对象

作者: 小羊爱学习 | 来源:发表于2022-07-26 17:25 被阅读0次

在swift中,展不能添加存储属性,Swift中可以使用Objective-C的关联对象(Associated Objects)的方式添加属性,弥补这一痛点
1、objc_setAssociatedObject

2、objc_getAssociatedObject

3、objc_removeAssociatedObjects

需要注意的是:objc_removeAssociatedObjects会删除对象关联的所有属性,所以可能导致把一些非自己添加的关联属性也删除掉。如果要删除某属性,使用objc_setAssociatedObject将value设置为nil即可

extension User {
    private static var AGE_KEY:Bool = false
    private static var WEIGHT_KEY: Bool = false
    var newAge:Int {
        get{
            objc_getAssociatedObject(self, &Self.AGE_KEY) as? Int ?? 0
        }
        set(n){
            objc_setAssociatedObject(self, &Self.AGE_KEY, n, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    var address: String {
        get{
            objc_getAssociatedObject(self, &Self.WEIGHT_KEY) as? String ?? "暂无地址"
        }
        set{
            objc_setAssociatedObject(self, &Self.WEIGHT_KEY, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    func removeAll() {
        objc_removeAssociatedObjects(self)
    }
    
    func removeAge() {
        objc_setAssociatedObject(self, &Self.AGE_KEY, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
}

使用:

        let u = User()
        print(u.newAge)
        print(u.address)
        u.newAge = 10
        u.address = "address"
        print(u.newAge)
        print(u.address)
        
        u.removeAge()
        print(u.newAge)
        print(u.address)
        
        u.removeAll()
        print(u.newAge)
        print(u.address)

打印结果:

0
暂无地址
10
address
0
address
0
暂无地址

相关文章

  • Swift 为分类增加属性objc_getAssociated

    OC 获取关联对象 Swift 获取关联对象——错误的写法 Swift 获取关联对象——正确的写法 设置关联对象 ...

  • Swift之关联对象

    在swift中,展不能添加存储属性,Swift中可以使用Objective-C的关联对象(Associated O...

  • Swift如何借助Extension增加存储属性

    // 关联对象(Associated Object)// 在Swift中,class依然可以使用关联对象// ...

  • swift中的Associated Object

    关联对象在swift中仍然适用。

  • Swift - 关联对象

    简单点讲,就是类似OC的分类里面,扩展了一个属性,一般原则上这样是不允许的,但是通过关联对象的这种方法,是可以的

  • iOS原理篇:关联对象

    前言 Swift中不能再extension中为类添加存储属性,如何利用关联对象变相添加属性呢? 关联对象相关API...

  • Swift 5.0-typealias与associatedty

    Swift 中关键字typealias重命名与associatedtype关联对象,在实际开发中比较常见。 typ...

  • Swift在扩展中关联对象

    原文在这里, 转载请贴原文链接 Objective-C 最让人诟病的也许就是不能给已有类添加属性, 但是可以通过 ...

  • runtime 之关联对象

    如何给一个NSArray添加一个属性,不能使用继承。 分类不能添加属性,只能添加方法。这时就可以使用关联对象。 关...

  • Runtime 之关联对象

    关联对象是指某个OC对象通过一个唯一的key连接到一个类的实例上。 关联对象的原理: Runtime提供的API:...

网友评论

    本文标题:Swift之关联对象

    本文链接:https://www.haomeiwen.com/subject/wxgoirtx.html