Swift objc_getAssociatedObject 始终为零
Swift objc_getAssociatedObject always nil
我正在尝试将 属性 关联到数组扩展:
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 调用总是 returns nil!!
有人知道为什么吗?
最后一个小时,我一直在为这个问题苦苦思索...
您不能将关联对象添加到SwiftArray
(或任何Swift值类型)。
objc_setAssociatedObject()
和 objc_getAssociatedObject()
来自
Objective-C 运行时,他们首先期望 NSObject
的实例
参数。
你的代码编译和运行只是因为任何 Swift 值是自动的
如有必要,桥接到一个对象。
当你调用 objc_setAssociatedObject(self, ...)
然后 self
桥接到 NSArray
的(临时)实例,并且关联
是在那个物体上制作的。
稍后调用objc_getAssociatedObject(self, ...)
时,
NSArray
的另一个 (临时)实例已创建,并且
没有关联对象。
这就是您得到 nil
作为结果的原因。
我正在尝试将 属性 关联到数组扩展:
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 调用总是 returns nil!!
有人知道为什么吗?
最后一个小时,我一直在为这个问题苦苦思索...
您不能将关联对象添加到SwiftArray
(或任何Swift值类型)。
objc_setAssociatedObject()
和 objc_getAssociatedObject()
来自
Objective-C 运行时,他们首先期望 NSObject
的实例
参数。
你的代码编译和运行只是因为任何 Swift 值是自动的 如有必要,桥接到一个对象。
当你调用
objc_setAssociatedObject(self, ...)
然后self
桥接到NSArray
的(临时)实例,并且关联 是在那个物体上制作的。稍后调用
objc_getAssociatedObject(self, ...)
时,NSArray
的另一个 (临时)实例已创建,并且 没有关联对象。
这就是您得到 nil
作为结果的原因。