繁体   English   中英

为什么在 Swift 中初始化变量的行上会出现“初始化之前使用的变量”错误?

[英]Why do I get a "Variable used before being initialized" error on the line that I initialise the variable in Swift?

我正在努力理解为什么我在使用 Swift 的 iOS 项目中收到此编译器错误。 如果我创建以下类:

class InitTest {

    let a: Int
    let b: Int
    let c: Int

    init () {
        self.a = 3
        self.b = 4
        self.c = self.runCalculation()
    }

    func runCalculation () -> Int {
        return self.a * self.b
    }
}

我在self.c = self.runCalculation()行上收到一个编译器错误,说“在初始化之前使用了变量‘self.c’”。

起初我以为这是因为编译器无法验证runCalculation()方法没有访问self.c ,但后来我尝试将 init 方法混合起来:

init () {
    self.a = 3
    self.c = self.runCalculation()
    self.b = 4
}

这次错误是“在初始化之前使用了变量‘self.b’”(在同一self.runCalculation()行上)。 这表明编译器能够检查其性能的方法访问,所以据我可以看到应该有最初的情况下,没有问题的。

当然,这是一个微不足道的例子,我可以轻松地重构以避免调用计算方法,但在实际项目中可能会有多个计算,每个计算都可能涉及很多。 我希望能够分离出逻辑以保持可读性。

幸运的是,有一个简单的解决方法:

init () {
    self.a = 3
    self.b = 4

    self.c = 0
    self.c = self.runCalculation()
}

(或使用属性初始值设定项let c = 0 )但我想了解为什么编译器对第一个示例有问题。 我是不是遗漏了什么,还是不必要的限制?

由于两阶段初始化,Swift 具有这种行为。 来自 Apple 的 Swift 书:

Swift 中的类初始化是一个两阶段的过程。 在第一阶段,每个存储的属性都由引入它的类分配一个初始值。 一旦确定了每个存储属性的初始状态,第二阶段就开始了,每个类都有机会在新实例准备好使用之前进一步自定义其存储属性。

在第一阶段结束之前,类需要某种默认值。 自定义值是第二阶段的一部分。

Objective-C 没有这种行为,因为它总是可以为基元提供0作为默认值,为对象提供nil ,但是在 Swift 中没有提供这样一个默认值的机制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM