Swift 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 всегда возвращает ноль!!

У кого-нибудь есть идеи, почему?

Я бьюсь головой об этом в последний час...

1 ответ

Решение

Вы не можете добавлять связанные объекты в Swift Array (или любой тип значения Swift). objc_setAssociatedObject() а также objc_getAssociatedObject() из среды выполнения Objective C, они ожидают экземпляра NSObject в качестве первого аргумента.

Ваш код компилируется и выполняется только потому, что любое значение Swift автоматически соединяется с объектом при необходимости.

  • Когда вы звоните objc_setAssociatedObject(self, ...) затем selfсоединен с (временным) экземпляром NSArrayи ассоциация сделана на этом объекте.

  • Позже, когда objc_getAssociatedObject(self, ...) называется,другой (временный) экземпляр NSArray создан, и это не имеет никакого связанного объекта.

Вот почему вы получаете nil в результате.

Другие вопросы по тегам