Swift Struct实例在更新其值时发生更改

时间:2019-04-09 20:44:52

标签: arrays swift memory-management struct

我观察到,当我们更改struct的属性值时,就会创建一个新的struct对象。

struct StructureTest {
    var i: Int

    mutating func changeValue(_ val: Int) {
        i = val
    }
}

var st = StructureTest(i: 10) {
    didSet{
        print("struct changed")
    }
}

print("before: \(st)")
st.changeValue(20)
print("after: \(st)")

输出:

before: StructureTest(i: 10)   
struct changed
after: StructureTest(i: 20)

主要的事情是,我注意到更改属性值之后。创建一个新的结构对象,并将其分配给var st

我确实知道什么是“值类型”以及什么是“分配时复制”功能。

但是我不明白为什么会在这里发生? 也许我在这里缺少什么? 让我知道您是否知道创建此新结构实例的原因。

与此同时,我还有一个观察者要注意的另一件事:

如果我有一个结构体数组。像这样:

struct StructureTest {
    var i: Int

    mutating func changeValue(_ val: Int) {
        i = val
    }
}

var arrStructs = [StructureTest(i: 10), StructureTest(i: 20)] {
    didSet {
        print("arrStructs changed")
    }
}

arrStructs[0].changeValue(30)

输出:

arrStructs changed

我不明白为什么要修改数组?

从值类型的“写入副本”功能可以理解的很多。 当阵列被修改且阵列容量需要创建一个新阵列时,应该会发生这种情况,但在这种情况下,阵列修改的原因我不清楚。

请让我知道是否知道其背后的原因,或者是否可以向我提供任何澄清的参考。

对不起我的语法错误。希望问题的实质对您清楚。

1 个答案:

答案 0 :(得分:2)

这些结构具有值语义,因此,当您对结构进行变异时,便为其分配了新的值;即,您更改了变量保存的值。 swift中的Array是一种通用结构,因此也具有值语义(不同于大多数以array为引用的语言)。因此,如果您对数组的任何元素进行突变,那么您就更改了整个数组的值。