如何防止修改字典副本

How to prevent from modifying a copy of dictionary

我遇到了以下问题。

我有一个名为 A 的函数,它接受以下字典作为参数 [String : MyClass],其中 MyClass 是自定义的我创建的 class(它是 NSObject 的子 class)。 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 实例的引用副本所做的更改,无论是在字典中还是任何其他值类型中,都将反映在对 MyClass 的同一实例的任何其他引用中。 =15=]

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