我目前正在练习Swift Language iBook的例子。我的理解"让"是我们使用"让"做一个常数。一旦我们为它赋值,我们就不能再为它分配另一个值。如下面的代码:
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
}
}
在此示例中,它已将值分配给红色,绿色和蓝色,使用&#34; let&#34;。
为什么我们可以在init中再次为这三个变量赋值?
答案 0 :(得分:11)
如果您没有在构造函数中自己初始化它们,let
中的初始化将提供默认值。
构造函数(init
)很特别。在它们内部,您可以分配一个常量实例变量。实际上,如果您没有默认值,则必须分配给它们。 (这也适用于课程。)
感谢Qwerty Bob在文档中找到这个
在初始化期间修改常量属性
您可以在初始化期间的任何时刻修改常量属性的值,只要在初始化完成时将其设置为确定值即可。
摘自:Apple Inc.“The Swift Programming Language。”iBooks。 https://itun.es/us/jEUH0.l
答案 1 :(得分:5)
您可以在init过程中使用self关键字之前设置常量变量。在此之后,他们真正“恒定”。
您必须在使用self关键字之前执行此操作,就像将其传递给另一个对象一样,它可以依次调用依赖于该常量属性的您的方法
答案 2 :(得分:1)
如果您继续阅读本书中给出的示例之后的几段(除非他们在多个位置使用它),它实际上会讨论这种行为:
您可以在任何时候修改常量属性的值 初始化,只要它按时间设置为一个确定的值 初始化完成。
所以基本上你可以修改常量,在结束初始化时,所有常量都必须有一个确定的值。它还继续讨论它如何与子类一起工作:
对于类实例,只能在期间修改常量属性 由引入它的类初始化。它无法修改 由子类。
以下是doc reference(与本书相同),引用的部分位于&#34;初始化期间修改常量属性&#34;副标题。
答案 3 :(得分:1)
并且:结构通过值而不是通过引用传递,因此在设置之后根本不能修改结构中的变量。所以let关键字真的很有意义。
答案 4 :(得分:0)
除了凯文回答的初始化部分之外,你仍然缺少let的常量部分。所以澄清let并不是一个常数。
根据“The Swift Programming Language”.Apple Inc.,2014-05-27T07:00:00Z。 iBooks的:
与C一样,Swift使用变量来存储,并使用引用来表示值 识别名称。 Swift还广泛使用其变量 值无法更改。这些被称为常数,并且很多 比C中的常量更强大。
var
和let
都是引用,因此let
是 const引用。
使用基本类型并不能真正显示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"