Swift 为什么必须初始化一个声明为可选的常量?
请原谅这个基本问题 我将一个常量声明为可选字符串,然后使用if let…将其展开 我得到以下错误: 初始化前使用的常量“favoriteSong” 如果我没有给一个可选的函数赋值,为什么它的值不是nil,If让函数捕捉它Swift 为什么必须初始化一个声明为可选的常量?,swift,Swift,请原谅这个基本问题 我将一个常量声明为可选字符串,然后使用if let…将其展开 我得到以下错误: 初始化前使用的常量“favoriteSong” 如果我没有给一个可选的函数赋值,为什么它的值不是nil,If让函数捕捉它 let favoriteSong: String? if let favoriteSong = favoriteSong { print("My favorite song is \(favoriteSong)") } else { print("I don't
let favoriteSong: String?
if let favoriteSong = favoriteSong {
print("My favorite song is \(favoriteSong)")
} else {
print("I don't have a favorite song")
}
如果我没有给一个可选的函数赋值,为什么它的值不是nil,If让函数捕捉它
let favoriteSong: String?
if let favoriteSong = favoriteSong {
print("My favorite song is \(favoriteSong)")
} else {
print("I don't have a favorite song")
}
如果将其初始化为nil
,则如下所示:
let favoriteSong: String? = nil
let favoriteSong: String?
favoriteSong = nil
或者像这样:
let favoriteSong: String? = nil
let favoriteSong: String?
favoriteSong = nil
但你也没做。因此,因为您可能仍然执行了第二个操作,所以当您尝试使用未初始化的变量时,编译器会给出一个错误
这样想:如果
let favoriteSong: String?
…自动意味着
let favoriteSong: String? = nil
…那么就不可能这样说:
let favoriteSong: String?
favoriteSong = "Rock Around the Clock"
…因为这是一个常数-它无法更改。但我们必须能够这么说!这是合法的语法。因此,这不是什么
…意味着。你看到了吗
var
的规则不同,因为它是可变的。因此,您会自动将默认初始化设置为nil
,并可以在以后对其进行更改
但是对于let
,您在初始化时只获得一次机会,因此不会获得自动默认值,这将阻止您在下一行中进行自己的初始化;您必须显式初始化
如果我没有给一个可选的函数赋值,为什么它的值不是nil,If让函数捕捉它
let favoriteSong: String?
if let favoriteSong = favoriteSong {
print("My favorite song is \(favoriteSong)")
} else {
print("I don't have a favorite song")
}
如果将其初始化为nil
,则如下所示:
let favoriteSong: String? = nil
let favoriteSong: String?
favoriteSong = nil
或者像这样:
let favoriteSong: String? = nil
let favoriteSong: String?
favoriteSong = nil
但你也没做。因此,因为您可能仍然执行了第二个操作,所以当您尝试使用未初始化的变量时,编译器会给出一个错误
这样想:如果
let favoriteSong: String?
…自动意味着
let favoriteSong: String? = nil
…那么就不可能这样说:
let favoriteSong: String?
favoriteSong = "Rock Around the Clock"
…因为这是一个常数-它无法更改。但我们必须能够这么说!这是合法的语法。因此,这不是什么
…意味着。你看到了吗
var
的规则不同,因为它是可变的。因此,您会自动将默认初始化设置为nil
,并可以在以后对其进行更改
但是对于
let
,您在初始化时只获得一次机会,因此不会获得自动默认值,这将阻止您在下一行中进行自己的初始化;您必须显式初始化。我不认为如果let使用相同的变量名,您可以,这可能是错误的。如果希望它从nil
开始,您必须分配nil
。这就是Swift在这方面的工作方式。我认为如果let
使用相同的变量名,则可能是错误的。如果希望它从nil
开始,则必须指定nil
。这就是斯威夫特在这方面的工作方式。现在有了完美的解释。谢谢现在完全有道理了。谢谢