【发布时间】:2014-07-30 06:34:11
【问题描述】:
我正在阅读 Swift 编程语言的简单值部分
“使用 let 生成常量,使用 var 生成变量。一个值 常量不需要在编译时知道,但你必须分配 它只是一个值”
所以我觉得我可以做到这一点
let aConstant:Int
aConstant = 5
但我得到 let 声明需要初始化表达式 !!
这是为什么呢? “常量的值不需要在编译时知道”是什么意思?
【问题讨论】:
我正在阅读 Swift 编程语言的简单值部分
“使用 let 生成常量,使用 var 生成变量。一个值 常量不需要在编译时知道,但你必须分配 它只是一个值”
所以我觉得我可以做到这一点
let aConstant:Int
aConstant = 5
但我得到 let 声明需要初始化表达式 !!
这是为什么呢? “常量的值不需要在编译时知道”是什么意思?
【问题讨论】:
在全局范围内声明常量时,必须用值对其进行初始化。
您只能在类/结构中延迟初始化常量,您可以选择在类/结构的初始化程序中对其进行初始化。
“常量的值不需要在编译时知道”的意思是指常量的值。在 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
}
【讨论】:
常量在编译时不需要知道,但初始化后必须有值:
class MyClass: NSObject {
let aConstant: Integer; // no value
init() {
aConstant = 4; // must have a value before calling super
super.init();
}
}
这允许您在声明后将常量设置为一个值,并且在编译时可能未知。
【讨论】:
let 关键字根据定义定义了一个constant。
因此,一旦设置就无法修改。
既然如此,就需要在声明的时候进行初始化!
这里的解决方案是:
let aConstant = 5
或将其更改为var
var aNonConstant:Int
aNonConstant = 5
【讨论】:
let aConstant = functionThatGeneratesARandomNumber(),但在那之后它仍然是一个常数,你不能重新分配它。
Int 之类的字面量。您可以拥有一个常量,即在运行时创建的对象。您唯一需要记住的是,它在定义后不能重新分配(常量!)
Swift 2 的答案:
你可以这样写常量:
let aConstant:Int
aConstant = 5
以这种方式设置类型意味着:“这将是常量,并且在您需要时它会有价值”。请注意,在设置值之前不能使用常量,存在编译时错误:
在初始化之前使用常量'aConstant'
此外,您只能将值设置为 aConstant 一次。如果第二次尝试设置值,会出现编译错误:
不可变值 'aConstant' 只能初始化一次
无论如何你不能对全局常量执行此操作,存在编译时错误:
全局 'let' 声明需要初始化表达式
【讨论】: