var set to struct 修改时真的被替换了吗?

Var set to struct really replaced when modified?

节日快乐!

我在 Neuberg 的 "iOS 10 Programming Fundamentals" 的第 147 页上遇到了困难。他的说法是 "when you apparently mutate an instance of a value type, you are actually replacing that instance with a different instance."

问题:如果这是真的,那为什么我没有看到正在初始化的新实例?

///////////////////// Slight modification from page 147 in Neuberg, 2016 edition
struct Digit {
    var number : Int
    init(_ n:Int) {
        self.number = n
        print("number was set in the initializer to: \(n)")
    }
}
var d : Digit = Digit(123) {
    didSet {   
        print("didSet detected old: \(oldValue.number) to new: \(d.number)")
    }
}
d.number = 42
d.number = 56

打印--
数字在初始化程序中设置为:123
检测到的 didSet 变化从:123 到 42
检测到 didSet 的变化从:42 到 56

但是我再也看不到了,"number was set..."

替换并不意味着再次调用init

它在概念上意味着您正在复制数据,修改(或变异)数据(如修改number),并用修改后的数据替换原始数据。

我没有读过这本书,但我相信提出这一点是为了明确区分引用类型和值类型。值类型通过复制传递,引用类型通过引用传递(即使用指针)。