怎么'实施'?

Sar*_*ran 1 structure constants ios swift

我直接从这个 Apple页面中提取了这个例子

struct FixedLengthRange {
    var firstValue: Int
    let length: Int
}
Run Code Online (Sandbox Code Playgroud)

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

let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
Run Code Online (Sandbox Code Playgroud)

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

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

我试图搜索这个,发现用关键字'let'搜索非常困难,因为这是很常见的术语.

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

mat*_*att 6

这是因为结构是一种值类型.这意味着它不能在适当的位置进行变异.

因此,如果我们有一个rangeOfFourItemsFixedLengthRange结构实例的变量,并且我们想要设置rangeOfFourItems.firstValue,我们实际上是从rangeOfFourItems存储中删除struct实例并将其替换另一个不同的struct实例firstValue.

一看就知道这是事实,声明rangeOfFourItemsvar并附二传手观测到它,然后更改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!
Run Code Online (Sandbox Code Playgroud)

这表明仅设置此struct实例的属性实际上设置了struct变量本身.

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

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