题目已经说明了一切......为什么在Swift中使用关键字“let”声明常量?
可能对于这个新手问题有一个简单的答案,但我在SO上找不到它。
编辑:好的,只是为了让问题更清楚。我知道它需要用某个名称初始化,但我认为也许"let"有更深层次的含义,或者它的来源?像“func”之类的其他东西对我来说似乎非常合理,所以我想知道"let"的更深层含义是什么。
实际上,在 Swift 中没有常量变量的概念。
常量是在编译时解析的表达式。例如,在 Objective-C 中,以下代码:
const NSString *string = [[NSString alloc] init];
编译错误,声明Initializer element is not a compile-time constant
。原因是NSString
被实例化在运行时,所以它不是一个编译时常量。
在Swift中,最接近的东西是不可变变量。区别可能并不明显,但是不可变变量不是常量,它是一个可以动态初始化一次且之后不能修改的变量。因此,不需要也不需要进行编译时评估 - 尽管我们经常使用不可变变量作为常量:
let url = "http://www.myurl.com"
let maxValue = 500
let maxIntervalInSeconds = 5 * 60 *60
但是不可变对象也可以使用在运行时计算的表达式进行初始化:
let url = isDebug ? "http://localhost" : "http://www.myservice.com"
let returnCode: Int = {
switch(errorCode) {
case 0: return 0
default: return 1
}
}()
后一个示例很有趣:使用闭包立即执行来初始化不可变变量(与var
不同,不可变变量不支持延迟初始化,因此这是使用多行表达式初始化的唯一方法)
let
的指定使得常量的创建变得明确。这提供了比隐式声明变量的语言更实用的优点(例如,隐式声明变量的语言使引入各种错误变得太容易)。常量与变量的理由在WWDC 2014视频介绍Swift的开头进行了讨论,在其中他们讨论了如何使用常量更加安全,可以优化代码,并使程序员的意图更加清晰。 - Roblet
在编程语言中有丰富的历史。原文链接:http://programmers.stackexchange.com/questions/194227/in-what-programming-language-did-let-first-appear - Rob