我直接从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/

10-13 02:38