【问题标题】:Swift self referencing class propertySwift 自引用类属性
【发布时间】:2014-12-11 15:25:20
【问题描述】:

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

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

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

【问题讨论】:

  • 也许,您可能想使用unsafeAddressOf(self)

标签: ios cocoa swift


【解决方案1】:

闭包内部$0 是一个指向ptr 的指针,因此具有类型 UnsafePointer&lt;UnsafePointer&lt;Void&gt;&gt;。你需要把它转换成ptr的类型:

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

这也可以写成:

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

任何UnsafePointer&lt;T&gt; 都可以从不同的UnsafePointer&lt;U&gt; 转换:

/// 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) }

【讨论】:

    【解决方案2】:

    这就是你的做法。

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

    Swift 允许甚至鼓励您在可以省略 self 关键字时省略。挑战在于确定 self 是强制性的和可选的情况。 在 Swift 中,self 是实例的一个特殊属性,它保存着实例本身。大多数时候 self 出现在类、结构或枚举的初始化程序或方法中。

    【讨论】:

      猜你喜欢
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多