arrays - Swift Struct 实例在更新它的值时发生变化

标签 arrays swift memory-management 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

我无法理解为什么要修改数组?

我可以从值类型的“写入副本”功能中了解到。 它应该发生在修改数组并且数组容量需要创建新数组时,但在这种情况下,我不清楚数组修改原因。

如果您确实知道这背后的原因,或者您可以为我提供任何引用以进行澄清,请告诉我。

抱歉我的语法错误。希望您清楚问题的本质。

最佳答案

结构体具有值语义,所以当你改变一个结构体时,你已经为它分配了一个新值;即你改变了变量持有的值(value)。 swift 中的数组是一个通用结构,因此它也具有值语义(不像大多数语言,数组是一个引用)。因此,如果改变数组的任何元素,就会改变整个数组的值。

关于arrays - Swift Struct 实例在更新它的值时发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601071/

相关文章:

objective-c - 使用 ARC 下载和解压缩文件后的内存警告

javascript - 为什么数组解构在这种情况下不起作用?

Javascript 数组扩展方法在 for 循环中被迭代

javascript - AngularJS - 如何将 json append 到另一个 json 对象?

swift - 从 iOS 导出 SCN 文件?

swift - Snapshot.value 在 setValueForKeys 上崩溃

windows - 衡量程序内存使用情况的最佳方法是什么?

java - 如何从 input.txt 文件创建字符串数组

ios - 何时使用 MKMapView 的 MKUserTrackingMode vs 位置管理器的开始更新位置?

ios - UIImageView 由于内存警告而崩溃,尝试加载大量图像