2017-08-24 30 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