Swift 不使用';我不知道用什么值初始化

Swift 不使用';我不知道用什么值初始化,swift,Swift,我正在学习swift,对于一个我想更好地理解的关于初始化的范例,我感到非常惊讶。(请注意,我不是专业开发人员) 在下面的代码中,我在构建时在最后一行上得到一个错误: 初始化前使用的变量“ex1” 因此,我的理解是,编译器不够聪明,无法理解ex1是在执行之前的“for”循环时初始化的 好的。所以现在我必须先将变量初始化为一个随机值。这对我来说似乎很奇怪,因为不初始化它们会让我觉得发现错误是安全的 现在我必须在没有警告的情况下携带一个可能错误的值。这是好的做法吗?我遗漏了什么吗?可以声明一个变量,而

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

在下面的代码中,我在构建时在最后一行上得到一个错误:

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

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

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


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

可以声明一个变量,而无需立即初始化它,也无需编译器抱怨。例如:

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

与所有使用强制/隐式展开的方法一样,如果你犯了错误或忘记了一个edge case,那么你的应用程序也有崩溃的风险,因此我只建议在没有其他方法的情况下使用,或者如果其他方法需要非常复杂的代码。

可以声明变量,而无需立即初始化变量,也无需编译器抱怨。例如:

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

与所有使用强制/隐式展开的方法一样,如果你犯了错误或忘记了一个edge case,那么你的应用程序也有崩溃的风险,因此我只建议在没有其他方法的情况下使用,或者如果其他方法需要非常复杂的代码。

编译器知道在您的开关中有一些情况下,
ex1
从未初始化过,比如
default
。此外,一般来说,在同一行中声明变量而不进行初始化的做法是不好的。不清楚你的目的是什么,除了不必要地、不切实际地拉扯编译器的链条。基本上,编译器不够聪明,无法理解你在做什么。不要编写不必要的复杂代码,这样的情况几乎永远不会发生(对于极少数的例外情况,隐式解包选项就是这样做的)。我的问题是,我不认为初始化一个我还不知道其值的变量有什么意义,就在我声明它的那一刻。@Hugues有些情况下你可以这样做,编译器会满意的地方,但你问题中的例子不是一个好例子。我将尝试展示一个更好的方法。编译器知道,在您的开关中,有一些情况下,
ex1
从未初始化过,比如
default
。此外,一般来说,在同一行中声明变量而不立即初始化是一种不好的做法。不清楚你的目的是什么,除了不必要地、不切实际地拉扯编译器的链条。基本上,编译器不够聪明,无法理解你在做什么。不要编写不必要的复杂代码,这样的情况几乎永远不会发生(对于极少数的例外情况,隐式解包选项就是这样做的)。我的问题是,我不认为初始化一个我还不知道其值的变量有什么意义,就在我声明它的那一刻。@Hugues有些情况下你可以这样做,编译器会满意的地方,但你问题中的例子不是一个好例子。我会尝试展示一个更好的例子!是我一直在照顾的。我的问题是,我使用一个循环来处理多个键盘输入,并根据循环的发生情况在每个循环发生时分配不同的变量。我仍然发现很难处理这样一个事实,即我必须在声明时初始化一个变量(使用一个伪值),作为一个好的实践。变量的用途是更改,如果它本身是一个具有类属性的类变量,那么有时这样做很烦人。我看不出有什么好处。“我想我错过了一些东西。”Hugues Vari说