我正在尝试将属性关联到数组扩展:
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!!
有人知道为什么吗?
我在最后一个小时里一直在敲我的头......
最佳答案
您不能将关联对象添加到 Swift Array
(或任何 Swift 值类型)。
objc_setAssociatedObject()
和 objc_getAssociatedObject()
来自
Objective-C 运行时,他们首先期望 NSObject
的实例
争论。
你的代码编译和运行只是因为任何 Swift 值都是自动的 必要时桥接到一个对象。
当你调用
objc_setAssociatedObject(self, ...)
然后self
桥接到NSArray
的(临时)实例,并且关联 是在那个物体上制作的。稍后,当
objc_getAssociatedObject(self, ...)
被调用时, 另一个NSArray
的(临时)实例被创建,并且那个 没有关联对象。
这就是您得到 nil
作为结果的原因。
关于Swift objc_getAssociatedObject 始终为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45859413/