在 super.init 之前的表达式中使用初始化属性时出现 Swift 错误

2024-01-08

这并不重要,并且有解决方法,但它令人困惑。

请参阅下面的最小示例。我指的是一个已初始化的属性,但在调用 super.init() 之前。为什么下面所示的语句会出现编译错误?在表达式的右手中使用属性与在左手中使用属性有什么特别之处吗?

我浏览了 Swift 语言指南,但找不到任何相关内容。是 swift 编译器搞砸了,还是我遗漏了一些关于属性、self 和 init 的内容?或者应该all在调用 super.init 之前引用“myProperty”是否出错?

(请注意,无论该属性是常量(带有“let”)还是其他类型(例如 Int),都没有关系 - 都会发生同样的情况。)

class MyClass : NSObject {
    var myProperty: Bool

    override init() {
        myProperty = true

        if myProperty { /* this is ok */ }
        if myProperty || true { /* this is ok */ }
        if true || myProperty  { /* this is NOT ok! ('self used before super.init') - WHY? */ }

        super.init()

        if true || myProperty  { /* now this is ok */ }
    }
}

这是一个副作用||被宣布为

func ||<T : BooleanType>(lhs: T, rhs: @autoclosure () -> Bool) -> Bool

所以编译器会处理

true || myProperty

as

true || { self.myProperty }()

原因是“短路”的行为||运算符:如果第一个 操作数为 true,则根本不能计算第二个操作数。

(边注:我认为这会在稍后阶段得到简化 编译/优化过程 这样最终的代码实际上不会创建和调用闭包。)

访问self闭包内会导致错误消息。你会 得到同样的错误

override init() {
    myProperty = true
    let a = { self }() // ERROR: self used before super.init
    super.init()
    let b = { self }() // OK after super.init
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 super.init 之前的表达式中使用初始化属性时出现 Swift 错误 的相关文章

随机推荐