我正在尝试将属性与数组扩展相关联:
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
}
}
objc_getAssociatedObject调用始终返回nil !!
任何人都知道为什么?
我正在敲打我最近一小时关于这个... ...
答案 0 :(得分:6)
你无法将关联对象添加到Swift Array
(或任何Swift值类型)。
objc_setAssociatedObject()
和objc_getAssociatedObject()
来自。{1}}
Objective-C运行时,他们期望NSObject
的实例为第一个
参数。
您的代码仅编译和运行,因为任何Swift值都是自动的 必要时桥接到一个物体。
致电objc_setAssociatedObject(self, ...)
然后self
被桥接到NSArray
的(临时)实例和关联
是在那个对象上制作的。
稍后,当objc_getAssociatedObject(self, ...)
被调用时,
创建了NSArray
的另一个(临时)实例
没有相关的对象。
这就是为什么你得到nil
的结果。