任何人都可以向我解释为什么这段代码会编译:
class MyClass {
let a: Bool
let b: Bool
init(aa: Bool, bb: Bool) {
self.a = aa
if self.a {/*Do Stuff*/}
self.b = bb
}
}
但是这段代码会抛出编译错误
Constant' self.c'在初始化之前使用
在第if self.a && self.b {/*Do Stuff*/}
行:
class MyClass {
let a: Bool
let b: Bool
let c: Bool
init(aa: Bool, bb: Bool, cc: Bool) {
self.a = aa
self.b = bb
if self.a && self.b {/*Do Stuff*/}
self.c = cc
}
}
我对Swift的两阶段初始化(https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-ID203)有一些基本的了解,我很确定这是错误的原因,但根据我的理解,不应该这样做。两个代码片段都抛出相同的编译器错误?
答案 0 :(得分:0)
是的,它与两阶段初始化有关。第二个示例中的问题是&&
。
与此相关的安全检查(以及您的链接):
“初始化程序无法调用任何实例方法,读取任何实例属性的值,或者在初始化的第一阶段完成之后将self作为值引用。”
修改您的第一个示例并添加&&操作者:
class MyClass {
let a: Bool
let b: Bool
init(aa: Bool, bb: Bool) {
self.a = aa
if self.a && self.b {/*Do Stuff*/}
self.b = bb
}
}
//Playground execution failed: MyPlayground.playground:4:26: error: constant 'self.b' used before being initialized
if self.a && self.b {/*Do Stuff*/}
修改您的第二个示例并删除&&操作者:
class MyClass {
let a: Bool
let b: Bool
let c: Bool
init(aa: Bool, bb: Bool, cc: Bool) {
self.a = aa
self.b = bb
if self.a {/*Do Stuff*/}
self.c = cc
}
}
//it runs fine
当然在使用&&&操作员完成初始化的第一阶段以及安全检查。但是,如果您尝试在初始化所有属性之前执行操作,则安全检查将失败。您还将受限于if self.a {/*Do Stuff*/}
关闭中您可以执行的操作。