【发布时间】:2019-04-09 20:44:51
【问题描述】:
我观察到,当我们确实更改了 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
我无法理解为什么要修改数组?
我可以从值类型的“写入副本”功能中了解到。 当数组被修改并且数组容量需要创建一个新数组时应该会发生这种情况,但在这种情况下,我不清楚数组修改的原因。
如果您知道背后的原因,或者您是否可以提供任何参考资料以供澄清,请告诉我。
抱歉我的语法错误。希望你清楚问题的本质。
【问题讨论】:
-
“我知道什么是值类型”我不认为你知道。值类型的本质是它不可变。因此,设置结构的属性意味着替换新结构。这就是为什么结构引用是可变的,必须是
var而不是let。例如,请参阅我的解释:stackoverflow.com/a/49806545/341994 -
是的。你说的对。这就是为什么我创建了一个可变结构实例“st”。所以我可以更新它的属性。感谢您的及时反馈。
标签: arrays swift memory-management struct