为什么必须初始化一个声明为可选的常量?

Mar*_*oon 3 swift

请原谅这个基本问题。

我将一个常量声明为可选字符串,然后我使用 if let... 来解开它。

我收到以下错误:

初始化之前使用的常量“favoriteSong”

如果我没有为可选值赋值,为什么它的值不是 nil 并且 if let 捕获它?

let favoriteSong: String?
if let favoriteSong = favoriteSong {
    print("My favorite song is \(favoriteSong)")
} else {
    print("I don't have a favorite song")
}
Run Code Online (Sandbox Code Playgroud)

mat*_*att 6

\n

如果我没有为可选值赋值,为什么它的值不是 nil 并且 if let 捕获它?

\n
\n\n

如果您将其初始化为nil,则可以这样:

\n\n
let favoriteSong: String? = nil\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者像这样:

\n\n
let favoriteSong: String?\nfavoriteSong = nil\n
Run Code Online (Sandbox Code Playgroud)\n\n

但你也没有这么做。因此,由于您可能仍然执行了第二个操作,因此当您尝试使用未初始化的变量时,编译器会给出错误。

\n\n

这样想:如果

\n\n
 let favoriteSong: String?\n
Run Code Online (Sandbox Code Playgroud)\n\n

...自动意味着

\n\n
 let favoriteSong: String? = nil\n
Run Code Online (Sandbox Code Playgroud)\n\n

……那么就不可能这样说:

\n\n
let favoriteSong: String?\nfavoriteSong = "Rock Around the Clock"\n
Run Code Online (Sandbox Code Playgroud)\n\n

...因为这是一个常数\xe2\x80\x94 它无法更改。但我们需要能够这么说!这是合法的语法。因此,这不是什么

\n\n
 let favoriteSong: String?\n
Run Code Online (Sandbox Code Playgroud)\n\n

...方法。你有看到?

\n\n

的规则var是不同的,因为它是可变的。因此,您将获得自动默认初始化,nil并且可以稍后更改它。

\n\n

但是对于let,您只能在初始化时获得一次机会,因此您不会获得自动默认值,这会阻止您在下一行中进行自己的初始化;你必须显式初始化。

\n