在Swift中结构体内使用"let"关键字

6

我目前正在练习《Swift语言iBook》中的例子。我的理解是,“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中再次为这三个变量分配值呢?

1
请注意,从Swift 1.2开始将不再支持此操作。 - Patrick Pijnappel
5个回答

13
let 中的初始化为你在构造函数中没有自己初始化的提供了默认值。 构造函数 (init) 是特殊的。在其中,你可以分配给一个常量实例变量。事实上,如果你没有为它们指定默认值,你必须对它们进行赋值。(这也适用于类。)
感谢 Qwerty Bob 在文档中找到此信息。

初始化期间修改常量属性

你可以在任何时候在初始化期间修改常量属性的值,只要在初始化结束时将其设置为明确的值即可。

摘自: Apple Inc. "The Swift Programming Language." iBooks. https://itun.es/us/jEUH0.l

1
你需要比"在初始化期间修改常量属性"更明确的东西吗? ;) - user1040049
@QwertyBob 谢谢,显然我在浏览那一章时错过了那个。 - Kevin

5

在使用self关键字之前,您可以在初始化过程中设置常量变量。在此之后,它们将真正地成为“常量”。

必须在使用self关键字之前进行设置,因为如果将其传递给另一个对象,该对象可能会调用您的某个方法,而该方法依赖于该常量属性。


2
并且:结构体是按值传递而不是按引用传递的,所以在设置变量后就不能修改结构体中的变量。因此,“let”关键字确实有意义。

1
如果您继续阅读书中给出的示例几段(除非它们在多个位置使用),实际上会谈论这种行为:
您可以在任何时候修改常量属性的值,只要在初始化完成时将其设置为确定的值即可。
因此,您可以修改常量,并且在初始化结束时,所有常量必须具有明确的值。它还讨论了子类如何使用这种方法:
对于类实例,只能通过引入它的类在初始化期间修改常量属性。它不能被子类修改。
这是文档参考的链接(与书本相同),引用部分位于“在初始化期间修改常量属性”子标题下。

0
除了由Kevin回答的初始化部分外,您仍然缺少let的常量部分。因此,为了澄清,let并不完全是一个常量。
根据“Swift编程语言”。Apple Inc.,2014-05-27T07:00:00Z. iBooks:
像C一样,Swift使用变量通过标识名称存储和引用值。Swift还广泛使用其值无法更改的变量。这些被称为常量,并且比C中的常量更强大。 varlet都是引用,因此let是一个const引用。使用基本类型并不能真正展示letconst的区别。区别在于将其与类实例(引用类型)一起使用时:
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"

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