2017-08-24 13 views
3

nilを私は、Array拡張子に関連付けられているプロパティにしようとしています:スウィフト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コールは常にnilを返します!

誰でも何らかの理由がありますか?

私はこのことについて、最後の時間のために私の頭を叩いています...

+0

あなたのコードも 'searchEmptyIndex' APIですか?あなたはそれをあなたの質問に含めることができますか? –

+0

ええええええええええええええええば添えて – YanivH

+1

Array extension内に 'searchEmptyIndex'があると仮定していますよね?上のコードでは、拡張子の外にあります。 –

答えて

4

あなたできないスウィフトArray(または任意のスウィフト値型)に関連付けられているオブジェクトを追加します。 objc_setAssociatedObject()およびobjc_getAssociatedObject()は、 Objective-Cランタイムからのもので、NSObjectのインスタンスが最初に 引数として指定されています。

スウィフトの値が自動的に が必要に応じてオブジェクトに橋渡しされるため、コードがコンパイルされて実行されます。

  • あなたは self、その後objc_setAssociatedObject(self, ...)を呼び出しNSArrayの(一時的な)インスタンスにブリッジされ、そして関連 は、そのオブジェクトに対して行われます。

  • NSArrayの別の(一時的な)インスタンスが作成される objc_getAssociatedObject(self, ...)が呼び出された後

    、、、及びその には関連付けられたオブジェクトを有していません。

その結果、nilが結果として得られます。

+0

Swiftタイプの拡張機能にプロパティを追加するにはどうすればよいですか? – YanivH

+2

@ YanivH:できません。 –

+0

また、配列をSwiftでもサブクラス化することはできませんか? – YanivH

関連する問題