Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么必须初始化一个声明为可选的常量?_Swift - Fatal编程技术网

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

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

请原谅这个基本问题

我将一个常量声明为可选字符串,然后使用if let…将其展开

我得到以下错误:

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

如果我没有给一个可选的函数赋值,为什么它的值不是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,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
。这就是斯威夫特在这方面的工作方式。现在有了完美的解释。谢谢现在完全有道理了。谢谢