Yan*_*ivH 4 associated-object swift
我试图将属性关联到数组扩展:
private var AssociatedObjectHandle: String = "BlaBLabla"
extension Array {
var emptyIndex:Int {
mutating get {
if let object = objc_getAssociatedObject(self, &AssociatedObjectHandle) {
return object as! Int
}
let index = self.searchEmptyIndex()
self.emptyIndex = index
return index
}
set {
let new = (newValue as NSInteger)
objc_setAssociatedObject(self, &AssociatedObjectHandle, new, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
}
func searchEmptyIndex() -> Int {
if let arr = self as? [Int] {
return arr.index(of: -1)!
}
return -1
}
}
Run Code Online (Sandbox Code Playgroud)
objc_getAssociatedObject调用总是返回nil !!
任何人都知道为什么?
关于这个,我正在敲打最后一小时...
您无法将关联对象添加到Swift Array(或任何Swift值类型).
objc_setAssociatedObject()并且objc_getAssociatedObject()来自Objective-C运行时,他们期望NSObject作为第一个参数的实例.
您的代码仅编译和运行,因为任何Swift值都会在必要时自动桥接到对象.
当你打电话objc_setAssociatedObject(self, ...),然后self
桥接到的(临时)实例NSArray,以及关联对该对象的.
稍后,当objc_getAssociatedObject(self, ...)调用时,
会创建另一个(临时)实例NSArray,并且该实例没有关联的对象.
这就是你得到nil结果的原因.
| 归档时间: |
|
| 查看次数: |
841 次 |
| 最近记录: |