代码之家  ›  专栏  ›  技术社区  ›  Martin Muldoon

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

  •  0
  • Martin Muldoon  · 技术社区  · 8 年前

    请原谅这个基本问题。

    我将一个常量声明为可选字符串,然后使用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")
    }
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   matt    8 年前

    如果我没有给一个可选的赋值,为什么它的值不是nil,而If让捕捉它?

    如果您将其初始化为 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 是不同的,因为它是可变的。因此,您将自动默认初始化为 以后可以更改。

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