如何在Swift中为自己创建一个静态指针变量?

时间:2016-02-11 03:22:08

标签: objective-c swift pointers

在Objective-C中,我经常使用static void*作为识别标签的模式。有时这些标签只在该函数/方法中使用,因此将变量放在函数内是很方便的。

例如:

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; 
}

问题是,如何在Swift中编写ObscurePropertyTag私有常量指针到自身? (优选2.1但未来已公布的版本应该没问题)

我环顾四周,似乎我必须将此ObscurePropertyTag作为成员变量,似乎没有办法绕过它。

2 个答案:

答案 0 :(得分:3)

与(Objective-)C不同,你不能取一个地址 Swift中未初始化的变量。因此创建自引用 指针分为两步:

Swift 2:

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

斯威夫特3:

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

出于您的目的,使用&全局变量的地址是否更容易,请参阅 示例

如果要将“标记”的范围限制为函数本身 然后,您可以在本地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
}

答案 1 :(得分:0)

试试这个:

var GetSomeObscureProperty: MyObscureObject = nil

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

简而言之

let GetSomeObscureProperty = UnsafePointer<()>()