【问题标题】:How to create a static pointer variable to itself in Swift?如何在 Swift 中创建一个指向自身的静态指针变量?
【发布时间】:2016-05-21 16:35:04
【问题描述】:

在 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 private-constant-pointer-to-itself ? (最好是 2.1,但未来已经发布的版本应该没问题)

我环顾四周,似乎我必须把这个ObscurePropertyTag 作为一个成员变量,而且似乎没有办法解决它。

【问题讨论】:

  • 您能否详细说明您要实现的目标。将您的 Objective-C 代码转换为等效的 Swift 代码可能不是最佳选择。
  • @Michael 一个例子是将地图视图中显示的MKPolyline 对象与其底层数据模型对象相关联。另一个是用于识别 CALayer 对象的特定子集(无需创建另一个集合对象来包含它们)。

标签: objective-c swift pointers


【解决方案1】:

与 (Objective-)C 不同,您不能获取 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) }

出于您的目的,将 global 变量的地址与&amp; 一起使用是否更容易,请参阅 例子

如果您想将“标签”的范围限制为函数本身 那么您可以在本地 struct 中使用 static 变量。示例:

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
}

【讨论】:

    【解决方案2】:

    试试这个:

    var GetSomeObscureProperty: MyObscureObject = nil
    
    withUnsafePointer(& GetSomeObscureProperty) {
        GetSomeObscureProperty = MyObscureObject($0) 
    }
    

    总之

    let GetSomeObscureProperty = UnsafePointer<()>()
    

    【讨论】:

    • 请尝试让我知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多