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
в результате.