gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:34:17 24 4
gpt4 key购买 nike

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

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

我查看了 Swift 语言指南,但找不到任何相关内容。 swift 编译器是不是在这里搞砸了,还是我遗漏了一些关于属性、 self 和初始化的东西?还是应该在调用 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

作为

true || { self.myProperty }()

原因是 || 运算符的“短路”行为:如果第一个操作数为真,则不得对第二个操作数求值。

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

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

override init() {
myProperty = true
let a = { self }() // ERROR: self used before super.init
super.init()
let b = { self }() // OK after super.init
}

关于在 super.init 之前在表达式中使用初始化属性的 Swift 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27302281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com