我直接从this Apple页面提取了此示例
struct FixedLengthRange {
var firstValue: Int
let length: Int
}
如果您将此结构的实例分配给常量,
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
它说即使将其声明为“var”,也无法更改其属性值
这使我想知道
let
是如何实现的?我希望对其进行任何分配都可以在编译时检测到并显示编译错误。但是在上述情况下,无论其定义如何,为何将其应用于结构的每个属性?我试图进行搜索,发现很难用关键字“let”进行搜索,因为这是一个非常普遍的术语。
谁能帮我理解这一点?
最佳答案
这是因为结构是值类型。这意味着它不能在适当位置突变。
因此,如果我们有一个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
也将是合法的。)关于ios - 如何执行“让”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33901071/