怎么样'让'实施?

时间:2015-11-24 18:23:52

标签: ios swift structure constants

我直接从this Apple页面

中提取了此示例
struct FixedLengthRange {
    var firstValue: Int
    let length: Int
}

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

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

它表示我们无法更改其属性值,即使它被声明为' var'

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

我尝试搜索此内容,发现很难使用关键字搜索' let'因为这是很常见的术语。

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

1 个答案:

答案 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也是合法的。)