这件事情是如此基本我确信已被问到但是我找不到它。
我正在快速3个游乐场进行实验,我想运行此代码:
import UIKit
var optionalVariable: Int? = 32
var anotherVariable: Int
if optionalVariable != nil{
print("This executed")
anotherVariable = 32
}
print(anotherVariable)
无法运行,我收到此错误:
Playground execution failed: error: chapter4.playground:5:7:
error: variable 'anotherVariable' used before being initialized
print(anotherVariable)
那有什么不对?当我为其分配值时,为什么我不能使用anotherVariable
的值?
如果我注释掉最后一行print(anotherVariable)
,
代码运行,输出打印为This executed
。
答案 0 :(得分:2)
Swift中有一条铁律:任何变量必须在使用其值之前初始化。
该行
var anotherVariable: Int
声明变量,但不初始化。
如果optionalVariable
为零,则anotherVariable
未初始化并导致崩溃。编译器可以在编译时检测到它并显示错误消息。
指定默认值,将声明行更改为
var anotherVariable = 10 // or 0 or whatever
或添加else
子句
var optionalVariable: Int? = 32
var anotherVariable: Int
if optionalVariable != nil{
print("This executed")
anotherVariable = 32
} else {
anotherVariable = 10
}
print(anotherVariable)
答案 1 :(得分:1)
编译器会看到存在anotherVariable
未初始化的路径(optionalVariable
为nil
时)。这可能发生在例如另一个线程将此可选变量设置为nil
。它不会发生在您的代码中,但编译器无法知道这一点。在将其传递给函数之前,您必须在某个时刻初始化anotherVariable
。
答案 2 :(得分:1)
您的变量被声明为Int
var anotherVariable: Int
问题在于,当您打印变量时,它可以是未初始化的(当optionalVariable
为nil
时)。 Int
必须具有值,并且编译器不会为您设置默认值,除非它是可选类型。任何类型或类在首次使用之前都应该有一个值,这就是您在评论print
行时没有错误的原因。
有两种方法可以解决这个问题。
通过初始化声明确保anotherVariable
在某个时间点初始化
var anotherVariable: Int = 0
或在else
案例
if optionalVariable != nil{
print("This executed")
anotherVariable = 32
}
else {
anotherVariable = 0
}
或将anotherVariable
设为可选(将其声明为Int?
)
var anotherVariable: Int?
默认情况下它是nil
。这与
var anotherVariable: Int? = nil
如果你来自C,那就是防止一些边缘情况,其中变量包含先前分配的值。