Sar*_*ran 1 structure constants ios swift
我直接从这个 Apple页面中提取了这个例子
struct FixedLengthRange {
var firstValue: Int
let length: Int
}
Run Code Online (Sandbox Code Playgroud)
如果您将此结构的实例分配给常量,
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
Run Code Online (Sandbox Code Playgroud)
它说我们不能改变它的属性值,即使它被声明为'var'
这让我想知道如何let实施?我希望在编译时可以检测到它的任何赋值并显示编译错误.但在上述情况下,为什么它适用于结构的每个属性,无论它是如何定义的?
我试图搜索这个,发现用关键字'let'搜索非常困难,因为这是很常见的术语.
任何人都可以帮我理解这个吗?
这是因为结构是一种值类型.这意味着它不能在适当的位置进行变异.
因此,如果我们有一个rangeOfFourItemsFixedLengthRange结构实例的变量,并且我们想要设置rangeOfFourItems.firstValue,我们实际上是从rangeOfFourItems存储中删除struct实例并将其替换为另一个不同的struct实例firstValue.
一看就知道这是事实,声明rangeOfFourItems与var并附二传手观测到它,然后更改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!
Run Code Online (Sandbox Code Playgroud)
这表明仅设置此struct实例的属性实际上设置了struct变量本身.
但是在你的代码中,我们不能这样做,因为rangeOfFourItems防止了这个隐式赋值 - 它被声明为let,意味着它必须保持不变.因此,rangeOfFourItems.firstValue在编译器级别阻止设置.
(如果FixedLengthRange是一个类而不是一个结构,它将是一个引用类型,并且在适当的位置是可变的,rangeOfFourItems.firstValue即使rangeOfFourItems声明了,设置也是合法的let.)
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |