在Swift中为什么要使用关键字“let”声明常量?

17

题目已经说明了一切......为什么在Swift中使用关键字“let”声明常量?

可能对于这个新手问题有一个简单的答案,但我在SO上找不到它。

编辑:好的,只是为了让问题更清楚。我知道它需要用某个名称初始化,但我认为也许"let"有更深层次的含义,或者它的来源?像“func”之类的其他东西对我来说似乎非常合理,所以我想知道"let"的更深层含义是什么。


1
我喜欢你的问题,但我认为你在这里找不到答案,因为它更多是关于计算机科学哲学和苹果的魔力 :) - Michal
1
let的指定使得常量的创建变得明确。这提供了比隐式声明变量的语言更实用的优点(例如,隐式声明变量的语言使引入各种错误变得太容易)。常量与变量的理由在WWDC 2014视频介绍Swift的开头进行了讨论,在其中他们讨论了如何使用常量更加安全,可以优化代码,并使程序员的意图更加清晰。 - Rob
3
针对您修改后的问题,let在编程语言中有丰富的历史。原文链接:http://programmers.stackexchange.com/questions/194227/in-what-programming-language-did-let-first-appear - Rob
1
谢谢,Rob。对于像我这样的新手来说,那真是非常有帮助的。感谢您的历史课! - theremin
“let”这个单词通常导致变量声明成为完整的英语句子,而“let”本身就是一个完整的单词,不像更长的“const”。简洁和历史无疑是两个主要原因。 - user652038
1个回答

17

实际上,在 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不同,不可变变量不支持延迟初始化,因此这是使用多行表达式初始化的唯一方法)


3
感谢你,Antonio。但是为什么它要用 "let" 初始化而不是 "foo" 或 "cheesecake"?对不起,我觉得我错过了回答我的初始问题的部分。 - theremin
3
一定要有一些东西吧?在数学中,“let”经常用于这种方式:让x = 5,让y = x * 2等等。 - Nate Cook
1
我认为“let”最初是在BASIC中使用的,在那个时代的开端... - Leandro Fournier
4
这可能有点儿愚蠢并且与此无关,但我总是把“let”解读为“任其自然”。 - andykkt
3
在苹果的文档中,它们被称为"常量"。您可以通过以下链接查看相关内容:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID311 - james_womack
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接