首页 > 解决方案 > 当您不知道使用什么值进行初始化时进行 Swift 初始化

问题描述

我正在快速学习,并且对我想更好地理解初始化的范例感到非常惊讶。(请注意我不是专业的开发人员)。

在以下代码中,我在最后一行的构建时收到错误:

在初始化之前使用的变量“ex1”

class Example {
var data:Int
init (value: Int){
    self.data = value
}
}
var ex1: Example
var ex2: Example

for i in 1...2 {
    switch i {
    case 1:
        ex1 = Example(value: 10)
    case 2 :
        ex2 = Example(value: 20)
    default:
        break
    }
}

var result = ex1

所以,我的理解是编译器不够聪明,无法理解 ex1 在之前的“for”循环中执行时被初始化。

好的。所以现在我必须先验地将我的变量初始化为一个随机值。这对我来说似乎很奇怪,因为不初始化它们感觉可以安全地发现错误。

现在我必须在没有警告的情况下携带一个可能错误的值。这是好习惯吗?我错过了什么吗?

标签: swift

解决方案


可以在不立即初始化且编译器不抱怨的情况下声明变量。例如:

let ex: Example
if someBoolean {
    ex = Example(value: 10)
} else {
    ex = Example(value: 20)
}
print(ex) // this should work fine

但是,编译器只有在所有声明的变量都在所有逻辑路径中初始化时才知道如何处理。在您的问题中,您只在开关的每种情况下初始化一个变量,而不是在默认情况下。您可能知道它们都将在循环结束时被初始化,但编译器不够聪明,无法弄清楚这一点。

无论如何,您也很少会想要这样做。如果您发现自己需要在循环的不同阶段初始化不同的变量,则很有可能您做错了什么,或者您可以更有效地编写代码。很难说如何在没有看到它的情况下简化您的实际代码,但是对于示例代码,您只需立即初始化两个变量即可获得相同的结果。

如果您必须这样做,并且您知道所有变量将在使用之前被初始化但编译器没有,您可以使用隐式展开的选项:

var ex1: Example!
var ex2: Example!
// other code is the same

与强制/隐式展开的所有使用一样,如果您犯了错误或忘记了边缘情况,这会带来您的应用程序崩溃的风险,所以我只建议在没有任何其他方法的情况下这样做,或者如果其他方式需要过于复杂的代码。


推荐阅读