这并不重要,并且有解决方法,但它令人困惑。
请参阅下面的最小示例。我指的是一个已初始化的属性,但在调用 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(使用前将#替换为@)