我正在尝试在swift中创建一个自引用类属性,但我无法弄清楚为什么它不起作用。我真的只想将此作为dispatch_set_specific的密钥来管理私有调度队列。
class SomeClass{
var ptr:UnsafePointer<Void> = nil
init() {
withUnsafePointer(&ptr, {
self.ptr = $0
})
}
}
答案 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出现在类,结构或枚举的初始化程序或方法中。