let声明需要初始化表达式

时间:2014-06-09 16:55:43

标签: ios constants swift let

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

  

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

所以我想我可以做到这一点

let aConstant:Int
aConstant = 5

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

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

4 个答案:

答案 0 :(得分:12)

来自Swift Language Reference

  

当在全局范围内声明常量时,必须使用值初始化它。

您只能在类/结构中推迟常量的初始化,您可以选择在类/结构的初始值设定项中初始化它。

&#34的含义;在编译时不需要知道常量的值"指常数的值。在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 
}

答案 1 :(得分:2)

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

class MyClass: NSObject {
    let aConstant: Integer; // no value

    init()  {
        aConstant = 4; // must have a value before calling super
        super.init();
    }
}

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

答案 2 :(得分:1)

let关键字定义为constant

因此,一旦设置,您就无法对其进行修改。

既然如此,他们需要在声明它们时进行初始化!

这里的解决方案是:

let aConstant = 5

或将其更改为var

var aNonConstant:Int
aNonConstant = 5

答案 3 :(得分:1)

回答Swift 2:

您可以按如下方式编写常量:

let aConstant:Int
aConstant = 5

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

  

常数' a恒定'在初始化之前使用

此外,您只能将值设置为aConstant一次。如果您尝试第二次设置值,则存在编译时错误:

  

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

无论如何你不能对全局常量这样做,有编译时错误:

  

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