Swift Struct实例在更新它的值时会更改

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift 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)

在改变它的属性值后,我注意到了主要的事情。创建一个新的struct对象并将其分配给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

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

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

请告诉我如果你确实知道背后的原因,或者你可以提供任何澄清的参考。

对不起我的语法错误。希望问题的本质对你来说很清楚。

答案

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

以上是关于Swift Struct实例在更新它的值时会更改的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 13 上同步更新线程内的发布值时,Swift 崩溃

Swift:结构实例不更新视图

更改 NSMutableDictionary 的值时崩溃

如何从函数内部更改全局变量的值?

当用户更改下拉过滤器中的值时,Django过滤更新查询

为啥 ofstream 在存储字符串的值时会避免前 4 个字符?