我直接从this Apple页面
中提取了此示例struct FixedLengthRange {
var firstValue: Int
let length: Int
}
如果您将此结构的实例分配给常量
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
它表示我们无法更改其属性值,即使它被声明为' var'
这让我想知道let
是如何实现的?我希望在编译时可以检测到它的任何赋值并显示编译错误。但在上述情况下,为什么它适用于结构的每个属性,无论它是如何定义的?
我尝试搜索此内容,发现很难使用关键字搜索' let'因为这是很常见的术语。
任何人都可以帮我理解这个吗?
答案 0 :(得分:6)
这是因为struct是值类型。这意味着它不能在适当的位置发生变异。
因此,如果我们有一个变量rangeOfFourItems
是一个FixedLengthRange结构实例,并且我们想要设置rangeOfFourItems.firstValue
,我们实际上正在从rangeOfFourItems
存储中删除结构实例并用替换它与另一个结构实例使用不同的firstValue
。
要确定这是真的,请使用rangeOfFourItems
声明var
并附加一个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!
这表明仅设置此struct实例的属性实际上是设置struct变量本身。
但是在你的代码中,我们不能这样做,因为rangeOfFourItems
阻止了这个隐式赋值 - 它用let
声明,意味着它必须保持不变。因此,在编译器级别阻止设置rangeOfFourItems.firstValue
。
(如果FixedLengthRange是一个类而不是一个结构,它将是一个引用类型,并且可以在适当的位置变化,并设置rangeOfFourItems.firstValue
即使用rangeOfFourItems
声明let
也是合法的。)