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 功能(例如作为用户定义的运行时属性)是必需的。
我有以下扩展用于自动 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 功能(例如作为用户定义的运行时属性)是必需的。