gpt4 book ai didi

ios - 如何防止修改字典副本

转载 作者:行者123 更新时间:2023-11-28 11:06:57 25 4
gpt4 key购买 nike

我遇到了以下问题。

我有一个名为 A 的函数,它采用以下字典作为参数 [String : MyClass],其中 MyClass 是自定义类我创建的(它是 NSObject 的子类)。MyClass 有一个名为 firstProperty 的属性。

函数 A 如下所示:

func A (someDictionary : [String : MyClass]) {
var someDictionaryCopy = someDictionary

someDictionaryCopy["Key"].updateValue()
}

好的,所以函数 A 主体中的第一行 正在复制传递给函数 A 的 someDictionary。但我不想改变或修改原始的 someDictionary。

第二行:我采用字典中的一些现有值并在 MyClass 实例上运行一个方法来修改其属性之一。

问题是,如果我运行上面的代码,传递给函数的原始字典也会被修改吗?为什么会这样?我怎样才能将字典传递给函数以使其不发生变化?

为方便起见,这里有一个 MyClass 实现的示例:

class MyClass : NSObject {
var someProperty : Double = 0.0

func updateValue() {
someProperty += 10.0
}
}

最佳答案

问题是 MyClass 是引用类型。当您复制字典时,它确实创建了字典的新副本,但新副本引用了与原始字典相同的 MyClass 实例。对任何地方的 MyClass 实例的引用副本所做的更改,无论它是在字典还是任何其他值类型中,都将反射(reflect)在对 MyClass 的同一实例的任何其他引用中

基本上,字典是一种值类型,这意味着它具有值语义。但是字典中的值是引用类型,所以它们具有引用语义。解决这个问题的唯一方法是为字典中的每个键创建一个MyClass 新实例的字典。或者,如@EricD 建议的那样,使用结构而不是类来获取您想要的值语义。

关于ios - 如何防止修改字典副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37033225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com