2017-08-24 67 views
3

我想相关的属性设置为一个阵列扩展:斯威夫特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调用总是返回零!

任何人有任何想法为什么?

我敲我的头有关此最后一小时......

+0

是'searchEmptyIndex' API你的代码吗?你可以在你的问题中加入吗? –

+0

是啊对不起...添加 – YanivH

+1

我假设'searchEmptyIndex'住在你的数组扩展中,对吧?在你的代码中,它在扩展之外。 –

回答

4

无法关联的对象添加到斯威夫特Array(或任何斯威夫特值类型)。 objc_setAssociatedObject()objc_getAssociatedObject()都来自于 Objective-C运行时,他们期望NSObject的实例作为第一个参数 。

您的代码只能编译并运行,因为任何Swift值都会自动被桥接到一个对象(如果有必要) 。

  • 当你调用objc_setAssociatedObject(self, ...)然后self 桥接到的NSArray一个(暂时的)实例,该协会 是对该对象的。

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

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

+0

那么如何添加Swift类型扩展的属性? – YanivH

+2

@YanivH:你不能。 –

+0

而你不能在Swift中继承Array? – YanivH