objc_getAssociatedObject 和运行时属性

objc_getAssociatedObject and Runtime attributes

我有以下扩展用于自动 save/retrieve UIImageView 特有的运行时属性:

import UIKit

var imgAttributeKey:String? = nil

extension UIImageView {
    
    var imgAttribute: String? {
        get { return objc_getAssociatedObject(self, &imgAttributeKey) as? String }
        set { objc_setAssociatedObject(self, &imgAttributeKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) }
    }
    
}

这工作正常,但最近再次尝试代码后,吸气剂总是返回零。 Swift 5 版本中是否发生了可能破坏此实现的更改?关于如何去做有什么建议吗?

感谢 Tarun Tyagi 指出正确的修复方法。

@objc 需要添加到扩展中的 属性 引用中。错误地标记外部 属性 导致 objc can only be used with members of 类, @objc protocols, and concrete extensions of 类 错误.

工作代码如下:

import UIKit

var imgAttributeKey:String? = nil

extension UIImageView {
    
    @objc var imgAttribute: String? {
        get { return objc_getAssociatedObject(self, &imgAttributeKey) as? String }
        set { objc_setAssociatedObject(self, &imgAttributeKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) }
    }
    
}

之所以需要这个项目是因为这个项目最初是在 Swift 3 中编写的,但从 Swift 4 开始,一个显式注释 @objc 用于动态 Objective-C 功能(例如作为用户定义的运行时属性)是必需的。