gpt4 book ai didi

swift - 在某些情况下,在初始化程序中访问实例属性会给出 "Variable used before being initialized"

转载 作者:搜寻专家 更新时间:2023-11-01 05:36:56 25 4
gpt4 key购买 nike

任何人都可以向我解释为什么这段代码可以编译:

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' 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 && 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 ) 有一些基本的了解,我很确定这是错误的原因,但根据我的理解,两个代码片段不应该抛出相同的编译器错误?

最佳答案

是的,它与两阶段初始化有关。第二个示例中的问题是 &&

来自与此相关的安全检查(以及您的链接):

“在初始化的第一阶段完成之前,初始化程序不能调用任何实例方法、读取任何实例属性的值或将自身作为值引用。”

修改您的第一个示例并添加 && 运算符:

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

当然,将 self.c 移动到带有 && 运算符的行之前会完成初始化的第一阶段以及安全检查。但是,如果您尝试在初始化所有属性之前执行操作,则安全检查会失败。你也将被限制在 if self.a {/*Do Stuff*/> 闭包中你能做什么。

关于swift - 在某些情况下,在初始化程序中访问实例属性会给出 "Variable used before being initialized",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36340903/

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