Swift objc_getAssociatedObject总是为零

Yan*_*ivH 4 associated-object swift

我试图将属性关联到数组扩展:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

objc_getAssociatedObject调用总是返回nil !!

任何人都知道为什么?

关于这个,我正在敲打最后一小时...

Mar*_*n R 6

无法将关联对象添加到Swift Array(或任何Swift值类型). objc_setAssociatedObject()并且objc_getAssociatedObject()来自Objective-C运行时,他们期望NSObject作为第一个参数的实例.

您的代码仅编译和运行,因为任何Swift值都会在必要时自动桥接到对象.

  • 当你打电话objc_setAssociatedObject(self, ...),然后self 桥接到的(临时)实例NSArray,以及关联对该对象的.

  • 稍后,当objc_getAssociatedObject(self, ...)调用时, 会创建另一个(临时)实例NSArray,并且该实例没有关联的对象.

这就是你得到nil结果的原因.

  • @YanivH:你做不到. (2认同)
  • @YanivH:不,“struct Array”是一种值类型,而不是一个类。 (2认同)