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 作为结果的原因。