gpt4 book ai didi

ios - 'let'是如何实现的?

转载 作者:搜寻专家 更新时间:2023-11-01 05:57:56 24 4
gpt4 key购买 nike

我直接从 this 中提取了这个例子苹果页面

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

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

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

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

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

我试着搜索这个,发现很难用关键字“let”搜索,因为它是很常见的术语。

谁能帮助我理解这一点?

最佳答案

这是因为结构是值类型。这意味着它不能就地改变。

因此,如果我们有一个变量 rangeOfFourItems,它是一个 FixedLengthRange 结构实例,并且我们想要设置 rangeOfFourItems.firstValue,我们实际上是在直接撕掉结构实例rangeOfFourItems 存储并将其替换为具有不同 firstValue另一个结构实例。

要证明这是真的,请使用 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!

这表明仅设置此结构实例的属性实际上设置了结构变量本身。

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

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

关于ios - 'let'是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33901071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com