为什么值类型的常量实例不能在引用类型的常量实例可以改变其属性时?

时间:2016-02-26 21:07:00

标签: swift reference constants

我是Swift的新手,正在尝试学习Property的概念。我在“swift programming language 2.1”中看到了下面的语句和代码。

struct FixedLengthRange {
    var firstvalue: Int
    let length: Int
}

let rangeOfFourItems = FixedLengthRange(firstvalue: 0, length: 4)
rangeOfFourItems.firstvalue = 8 //error: cannot assign to property: rangeOfFourItems is a "let" constant

本书为错误提供了以下解释:

  

此行为是由于结构是值类型。当一个实例   值类型的值被标记为常量,因此它的所有属性都是。

     

对于作为引用类型的类,情况也是如此。如果你   将参考类型的实例分配给常量,您仍然可以   更改该实例的变量属性。

为什么值类型的常量实例不能在引用类型的常量实例可以改变其属性时?它背后的原因是什么?这本书确实说过怎么但没能解释原因。我认为理解事物背后的原因是很好的做法。有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:2)

  

为什么值类型的常量实例不能更改其属性

因为值类型被视为不可分割的单元:它在赋值时被复制,传递它作为参数行为就像一个副本,因此使用const-ness锁定整个struct。从某种意义上说,rangeOfFourItems变量代表结构本身,而不是指针或对它的引用。

  

虽然引用类型的常量实例可以吗?

如果声明引用类型的const变量也使实例也是常量,这并不完全正确。只有引用是常量,而不是实例。

如果你考虑一下,这是有意义实现的唯一方法,因为多个变量可以引用相同的by-reference实例。如果其中一个变量是常量而另一个不是常量,则为常量变量赋值非const引用不可能锁定引用的对象,这也会锁定非const引用:

var a = ByRefType()
let b = a; // b is a constant reference to the same instance as "a"
a.property = newValue; // Prohibiting this assignment would be inconsistent

当然,与非常数变量b不同,常量变量本身(例如上面的a)无法重新分配。