Swift objc_getAssociatedObject总是为零

时间:2017-08-24 10:39:06

标签: swift associated-object

我正在尝试将属性与数组扩展相关联:

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 !!

任何人都知道为什么?

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

1 个答案:

答案 0 :(得分:6)

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

您的代码仅编译和运行,因为任何Swift值都是自动的 必要时桥接到一个物体。

  • 致电objc_setAssociatedObject(self, ...)然后self 被桥接到NSArray的(临时)实例和关联 是在那个对象上制作的。

  • 稍后,当objc_getAssociatedObject(self, ...)被调用时, 创建了NSArray的另一个(临时)实例 没有相关的对象。

这就是为什么你得到nil的结果。