【问题标题】:Why do you have to initialize a constant that is declared an optional? [duplicate]为什么必须初始化一个声明为可选的常量? [复制]
【发布时间】:2018-03-19 19:24:19
【问题描述】:

请原谅这个基本问题。

我将一个常量声明为一个可选字符串,然后我去解包它使用 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")
}

【问题讨论】:

  • 我不认为你可以 if let 使用相同的变量名,可能是错误的。
  • 如果您希望它以nil 开头,您必须指定nil。这就是 Swift 在这方面的工作方式。

标签: swift


【解决方案1】:

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

如果您将其初始化为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"

...因为这是一个常量——它不能被改变。但我们需要能够这么说!这是合法的语法。因此那是不是什么

 let favoriteSong: String?

...意思是。看到了吗?

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

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

【讨论】:

  • 现在很有意义。谢谢!
猜你喜欢
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 2014-08-08
  • 2021-09-03
相关资源
最近更新 更多