我正在阅读简单值部分中的Swift编程语言
“使用let生成常量,使用var生成变量。 a的价值 常量不需要在编译时知道,但必须分配 它只是一个值“
所以我想我可以做到这一点
let aConstant:Int
aConstant = 5
但我得让声明需要初始化表达式 !!
为什么?它们是什么意思“在编译时不需要知道常量的值”?
答案 0 :(得分:12)
当在全局范围内声明常量时,必须使用值初始化它。
您只能在类/结构中推迟常量的初始化,您可以选择在类/结构的初始值设定项中初始化它。
&#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'声明需要初始化表达式