【问题标题】:let declarations require an initializer expressionlet 声明需要一个初始化表达式
【发布时间】:2014-07-30 06:34:11
【问题描述】:

我正在阅读 Swift 编程语言的简单值部分

“使用 let 生成常量,使用 var 生成变量。一个值 常量不需要在编译时知道,但你必须分配 它只是一个值”

所以我觉得我可以做到这一点

let aConstant:Int
aConstant = 5

但我得到 let 声明需要初始化表达式 !!

这是为什么呢? “常量的值不需要在编译时知道”是什么意思?

【问题讨论】:

    标签: ios constants swift let


    【解决方案1】:

    来自Swift Language Reference

    在全局范围内声明常量时,必须用值对其进行初始化。

    您只能在类/结构中延迟初始化常量,您可以选择在类/结构的初始化程序中对其进行初始化。

    “常量的值不需要在编译时知道”的意思是指常量的值。在 C/Objective-C 中,需要为全局常量分配一个可由编译器计算的值(通常是像 10@"Hello" 这样的文字)。 Objective-C 中不允许以下内容:

    static const int foo = 10; // OK
    static const int bar = calculate_bar(); // Error: Initializer element is not a compile-time constant
    

    在 Swift 中你没有这个限制:

    let foo = 10 // OK
    let bar = calculateBar(); // OK
    

    编辑:

    原答案中的以下说法不正确:

    您只能在类/结构中延迟初始化常量,您可以选择在类/结构的初始化程序中对其进行初始化。

    您不能推迟的唯一地方是 全局范围(即顶级 let 表达式)。虽然您确实可以在类/结构中推迟初始化,但这不是唯一的地方。例如以下也是合法的:

    func foo() {
        let bar: Int
        bar = 1 
    }
    

    【讨论】:

      【解决方案2】:

      常量在编译时不需要知道,但初始化后必须有值:

      class MyClass: NSObject {
          let aConstant: Integer; // no value
      
          init()  {
              aConstant = 4; // must have a value before calling super
              super.init();
          }
      }
      

      这允许您在声明后将常量设置为一个值,并且在编译时可能未知。

      【讨论】:

        【解决方案3】:

        let 关键字根据定义定义了一个constant

        因此,一旦设置就无法修改。

        既然如此,就需要在声明的时候进行初始化!

        这里的解决方案是:

        let aConstant = 5
        

        或将其更改为var

        var aNonConstant:Int
        aNonConstant = 5
        

        【讨论】:

        • “常量的值不需要在编译时知道”怎么样?
        • 不,它没有,你可以做let aConstant = functionThatGeneratesARandomNumber(),但在那之后它仍然是一个常数,你不能重新分配它。
        • 此外,Swift 中的常量并不局限于诸如 Int 之类的字面量。您可以拥有一个常量,即在运行时创建的对象。您唯一需要记住的是,它在定义后不能重新分配(常量!)
        • 杰克,你错了。常量在声明时不需要初始化。它们需要初始化一次,但不一定在声明它们的同一行。
        【解决方案4】:

        Swift 2 的答案:

        你可以这样写常量:

        let aConstant:Int
        aConstant = 5
        

        以这种方式设置类型意味着:“这将是常量,并且在您需要时它会有价值”。请注意,在设置值之前不能使用常量,存在编译时错误:

        在初始化之前使用常量'aConstant'

        此外,您只能将值设置为 aConstant 一次。如果第二次尝试设置值,会出现编译错误:

        不可变值 'aConstant' 只能初始化一次

        无论如何你不能对全局常量执行此操作,存在编译时错误:

        全局 'let' 声明需要初始化表达式

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-14
          • 1970-01-01
          • 1970-01-01
          • 2015-04-27
          • 1970-01-01
          • 2017-10-04
          • 1970-01-01
          相关资源
          最近更新 更多