斯威夫特objc_getAssociatedObject始终为零
问题描述:
我想相关的属性设置为一个阵列扩展:斯威夫特objc_getAssociatedObject始终为零
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调用总是返回零!
任何人有任何想法为什么?
我敲我的头有关此最后一小时......
答
您无法关联的对象添加到斯威夫特Array
(或任何斯威夫特值类型)。 objc_setAssociatedObject()
和objc_getAssociatedObject()
都来自于 Objective-C运行时,他们期望NSObject
的实例作为第一个参数 。
您的代码只能编译并运行,因为任何Swift值都会自动被桥接到一个对象(如果有必要) 。
当你调用
objc_setAssociatedObject(self, ...)
然后self
桥接到的NSArray
一个(暂时的)实例,该协会 是对该对象的。稍后,当
objc_getAssociatedObject(self, ...)
被调用时, 被创建的另一NSArray
(临时)实例和 没有关联对象。
这就是为什么你得到nil
作为结果。
是'searchEmptyIndex' API你的代码吗?你可以在你的问题中加入吗? –
是啊对不起...添加 – YanivH
我假设'searchEmptyIndex'住在你的数组扩展中,对吧?在你的代码中,它在扩展之外。 –