“让”如何实现?

我从这个 Apple页面直接拉出了这个例子

struct FixedLengthRange { var firstValue: Int let length: Int } 

如果您将此结构的实例分配给常量,

 let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4) 

它说我们不能改变它的属性值,即使它被声明为“var”

这让我想知道如何实现? 我希望在编译时可以检测到任何赋值,并显示编译错误。 但是在上述情况下,为什么它适用于结构的每个属性,而不pipe它是如何定义的?

我试图search这个,发现很难search关键字'let',因为这是相当常见的术语。

任何人都可以帮我理解这个吗?

这是因为一个结构是一个值types 。 这意味着它不能被突变。

因此,如果我们有一个variablesrangeOfFourItems ,它是一个FixedLengthRange结构实例,并且我们想要设置rangeOfFourItems.firstValue ,实际上我们将结构实例从rangeOfFourItems存储中取出,并 另一个具有不同firstValue结构实例replace它。

为了看到这是真的,用var声明rangeOfFourItems并附加一个setter观察者,然后改变rangeOfFourItems.firstValue

 struct FixedLengthRange { var firstValue: Int let length: Int } var rangeOfFourItems = FixedLengthRange(firstValue:1, length:4) { didSet { print("Hey, you set me!") } } rangeOfFourItems.firstValue = 2 // Hey, you set me! 

这表明只是设置这个结构实例的属性实际上是设置了结构variables本身。

但是在你的代码中,我们不能这样做,因为rangeOfFourItems阻止了这个隐式赋值 – 它是用let声明的,这意味着它必须保持常量。 因此,在编译器级别防止设置rangeOfFourItems.firstValue

(如果FixedLengthRange是一个类,而不是一个结构体,它将是一个引用types ,并且可以在适当的位置变化,即使rangeOfFourItems是用let声明的,设置rangeOfFourItems.firstValue也是合法的。)