未分配的常量可选默认情况下不会为零
Constant unassigned optional will not be nil by default
目前我的理解:如果你定义一个可选变量而不赋值,编译器会自动赋值nil
代码片段:
A :
var someOptional : Int? //Change to `let` to trigger error
var aDefaultValue = 42
var theAnswer = someOptional ?? aDefaultValue
上面的代码片段工作正常,但是,当我将变量someOptional
更改为常量时,编译器报错(请参见下图)
B :
然后我尝试了类似的代码来解决问题。
var someOptional : Int?
print(someOptional)
仍然,它对变量工作正常,而对常量类型失败。
结论:
如果你定义一个可选常量,你必须明确地分配 nil 如果你是这个意思。因为它看起来没用(为什么你需要一个用 nil
赋值的常量选项),如果编译器自动为你做这件事,它可能会引入错误。
问题:
为什么编译器假设 nil
用于 var
声明的可选值而不是 let
声明的可选值?
是的,没错
可选变量不需要手动初始化。如果您在填充之前阅读它,它确实包含 nil
.
来自苹果 docs
If you define an optional variable without providing a default value, the variable is automatically set to nil for you [...]
另一方面,编译器会强制您在读取可选常量 (let
) 之前手动初始化它。
Unlike a variable, the value of a constant cannot be changed once it is set. Attempting to do so is reported as an error when your code is compiled [...]
为什么?
一个常量只能写一次。它不需要在初始化时发生在同一行,但它必须在您阅读它之前发生。
例如此代码工作正常
let num: Int?
num = 1
print(num)
然而,如果编译器在 num
中放置了一个临时 nil
值,那么常量将被写入两次。这违反了常量的概念。
let num: Int?
print(num) // nil ??? <- this can't work!
num = 1
print(num) // 1
另一个例子
此代码片段工作正常
func printArea(width: Int?, height:Int?) {
let area: Int?
if let width = width, height = height {
area = width * height
} else {
area = nil
}
print(area)
}
同样,如果编译器在 area
中放置了一个临时 nil
值,那么...
func printArea(width: Int?, height:Int?) {
let area: Int?
print(area) // not possible! area is going to change in a moment
if let width = width, height = height {
area = width * height
} else {
area = nil
}
print(area)
}
目前我的理解:如果你定义一个可选变量而不赋值,编译器会自动赋值nil
代码片段:
A :
var someOptional : Int? //Change to `let` to trigger error
var aDefaultValue = 42
var theAnswer = someOptional ?? aDefaultValue
上面的代码片段工作正常,但是,当我将变量someOptional
更改为常量时,编译器报错(请参见下图)
B :
然后我尝试了类似的代码来解决问题。
var someOptional : Int?
print(someOptional)
仍然,它对变量工作正常,而对常量类型失败。
结论:
如果你定义一个可选常量,你必须明确地分配 nil 如果你是这个意思。因为它看起来没用(为什么你需要一个用 nil
赋值的常量选项),如果编译器自动为你做这件事,它可能会引入错误。
问题:
为什么编译器假设 nil
用于 var
声明的可选值而不是 let
声明的可选值?
是的,没错
可选变量不需要手动初始化。如果您在填充之前阅读它,它确实包含 nil
.
来自苹果 docs
If you define an optional variable without providing a default value, the variable is automatically set to nil for you [...]
另一方面,编译器会强制您在读取可选常量 (let
) 之前手动初始化它。
Unlike a variable, the value of a constant cannot be changed once it is set. Attempting to do so is reported as an error when your code is compiled [...]
为什么?
一个常量只能写一次。它不需要在初始化时发生在同一行,但它必须在您阅读它之前发生。
例如此代码工作正常
let num: Int?
num = 1
print(num)
然而,如果编译器在 num
中放置了一个临时 nil
值,那么常量将被写入两次。这违反了常量的概念。
let num: Int?
print(num) // nil ??? <- this can't work!
num = 1
print(num) // 1
另一个例子
此代码片段工作正常
func printArea(width: Int?, height:Int?) {
let area: Int?
if let width = width, height = height {
area = width * height
} else {
area = nil
}
print(area)
}
同样,如果编译器在 area
中放置了一个临时 nil
值,那么...
func printArea(width: Int?, height:Int?) {
let area: Int?
print(area) // not possible! area is going to change in a moment
if let width = width, height = height {
area = width * height
} else {
area = nil
}
print(area)
}