我目前正在练习Swift Language iBook中的示例。我对"let"的理解是,我们用"let"来做一个常数。一旦我们给它赋值,就不能再给它赋值了。像下面的代码:
let city="NY"
city="LA" <--error (Cannot assign 'let' value city)
但我在iBook上看到了这个让我很困惑的例子:
struct Color{
let red=0.0, green=0.0, blue=0.0 //<---declare variables using "let" and assign value
init(red:Double,green:Double,blue:Double){
self.red=red //<---assign value to variable again?
self.green=green
self.blue=blue
}
}
在本例中,它已经为使用"let"的红色、绿色和蓝色指定了值。
为什么我们可以在init中再次为这三个变量赋值?
let
中的初始化提供默认值,如果您不在构造函数中自己初始化它们。构造函数(init
(是特殊的。在它们内部,您可以指定一个常量实例变量。事实上,如果您没有它们的默认值,则必须分配给它们。(这也适用于类。(
感谢Qwerty Bob在文档中找到这一点
初始化期间修改常量属性
您可以在初始化期间的任何点修改常量属性的值,只要在初始化完成时将其设置为确定值即可。
摘录自:苹果股份有限公司"Swift编程语言"iBooks。https://itun.es/us/jEUH0.l
在使用self关键字之前,您可以在初始化过程中设置常量变量。在这之后,它们才是真正的"恒定"。
您必须在使用self关键字之前执行此操作,就像您将其传递给另一个对象一样,它可以反过来调用您的方法,该方法依赖于常量属性
还有:结构是通过值而不是引用传递的,所以在结构中的变量集之后根本不能修改它们。所以let关键字真的很有意义。
如果你在书中给出的例子之后继续阅读几段(除非他们在多个地方使用它(,它实际上会谈论这种行为:
在初始化,只要它在时间之前设置为一个确定的值初始化完成。
因此,基本上您可以修改常量,并且在初始化结束时,所有常量都必须有一个确定的值。它还讨论了这是如何与子类一起工作的:
对于类实例,常量属性只能在由引入它的类初始化。不能修改通过一个子类。
这是它的文档参考(与本书相同(,引用的章节位于"初始化期间修改常量属性"副标题下。
除了Kevin回答的初始化部分外,您仍然缺少let的常量部分。所以澄清let并不是一个常数。
根据"Swift编程语言"苹果股份有限公司,2014-05-27T07:00:00Z。iBooks:
与C一样,Swift使用变量存储值,通过识别名称。Swift还广泛使用了以下变量值不能更改。这些被称为常数比C.中的常数更强大
var
和let
都是引用,因此let
是const引用class CTest
{
var str : String = ""
}
let letTest = CTest()
letTest.str = "test" // OK
letTest.str = "another test" // Still OK
//letTest = CTest() // Error
var varTest1 = CTest()
var varTest2 = CTest()
var varTest3 = CTest()
varTest1.str = "var 1"
varTest2.str = "var 2"
varTest3 = varTest1
varTest1.str = "var 3"
varTest3.str // "var 3"