2016-02-11 41 views
1

在Objective-C中,我經常使用使用static void*作爲識別標記的模式。有時這些標籤只用於該函數/方法中,因此將該變量放置在函數內部很方便。如何在Swift中爲自己創建一個靜態指針變量?

例如:

MyObscureObject* GetSomeObscureProperty(id obj) { 
    static void* const ObscurePropertyTag = &ObscurePropertyTag; 
    MyObscureObject* propValue = objc_getAssociatedObject(id,ObscurePropertyTag); 
    if(!propValue) { 
     propValue = ... // lazy-instantiate property 
     objc_setAssociatedObject(obj,ObscurePropertyTag,propValue, OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
    } 
    return propValue; 
} 

的問題是,如何寫ObscurePropertyTag私人恆定指針到自身的斯威夫特? (優選2.1,但未來已公佈的版本應該沒問題)

我環顧四周,似乎我必須將此ObscurePropertyTag作爲成員變量,並且似乎沒有解決方法。

+0

您可以詳細說明您要實現的目標嗎?將您的Objective-C代碼轉換爲Swift等價物可能不是最好的選擇。 – Michael

+0

@Michael一個例子是將地圖視圖中顯示的MKPolyline對象與其基礎數據模型對象相關聯。另一個用於識別CALayer對象的特定子集(不創建另一個包含它們的集合對象)。 – adib

回答

3

不像(Objective-)C,你不能把在斯威夫特的 未初始化變量的地址。因此,創建一個自引用 指針是兩個步驟:

斯威夫特2:

var ptr : UnsafePointer<Void> = nil 
withUnsafeMutablePointer(&ptr) { $0.memory = UnsafePointer($0) } 

斯威夫特3:

var ptr = UnsafeRawPointer(bitPattern: 1)! 
ptr = withUnsafePointer(to: &ptr) { UnsafeRawPointer($0) } 

你的目的,是更容易以&使用全局變量的地址,參見 示例le

如果你想限制「標籤」函數本身 的範圍,那麼你可以使用本地struct靜態變量。例如:

func obscureProperty(obj : AnyObject) -> MyObscureObject { 
    struct Tag { 
     static var ObscurePropertyTag : Int = 0 
    } 
    if let propValue = objc_getAssociatedObject(obj, &Tag.ObscurePropertyTag) as? MyObscureObject { 
     return propValue 
    } 
    let propValue = ... // lazy instantiate property value 
    objc_setAssociatedObject(obj, &Tag.ObscurePropertyTag,propValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
    return propValue 
} 
0

試試這個:

var GetSomeObscureProperty: MyObscureObject = nil 

withUnsafePointer(& GetSomeObscureProperty) { 
    GetSomeObscureProperty = MyObscureObject($0) 
} 

總之

let GetSomeObscureProperty = UnsafePointer<()>() 
+0

這將工作在一個獨立的功能? – adib

+0

請嘗試讓我知道。 – TechBee

相關問題