Swift自引用类属性

时间:2014-12-11 15:25:20

标签: ios cocoa swift

我正在尝试在swift中创建一个自引用类属性,但我无法弄清楚为什么它不起作用。我真的只想将此作为dispatch_set_specific的密钥来管理私有调度队列。

class SomeClass{
    var ptr:UnsafePointer<Void> = nil

    init() {
        withUnsafePointer(&ptr, {
            self.ptr  = $0
        })
    }
}

2 个答案:

答案 0 :(得分:4)

在闭包$0内是指向ptr的指针,因此具有类型 UnsafePointer<UnsafePointer<Void>>。您需要将其转换为ptr的类型:

withUnsafePointer(&ptr, {
    self.ptr  = UnsafePointer($0)
})

这也可以写成:

ptr = withUnsafePointer(&ptr) { UnsafePointer($0) }

任何UnsafePointer<T>都可以从其他UnsafePointer<U>转换:

/// Convert from a UnsafePointer of a different type.
///
/// This is a fundamentally unsafe conversion.
init<U>(_ from: UnsafePointer<U>)

并且从上下文中自动推断出类型,因此编写

就足够了
UnsafePointer($0)

而不是

UnsafePointer<Void>($0)

Swift 3的更新:

var ptr = UnsafeRawPointer(bitPattern: 1)!

ptr = withUnsafePointer(to: &ptr) { UnsafeRawPointer($0) }

答案 1 :(得分:0)

这就是您的操作方式。

self.ptr = UnsafePointer($ 0)<-访问实例属性或方法

迅速允许甚至鼓励您在可以的情况下省略self关键字。面临的挑战是确定自我必选和可选时的情况。 在Swift中,self是实例的特殊属性,用于保存实例本身。多数情况下,self出现在类,结构或枚举的初始化程序或方法中。