如何防止修改字典副本

时间:2016-05-04 16:25:55

标签: ios swift class dictionary foundation

我遇到了以下问题。

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

功能A 如下所示:

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

    someDictionaryCopy["Key"].updateValue()
} 

好的,所以函数A正文中的第一行正在复制传递给函数A的someDictionary。但是我不想改变或修改原来的某些字典。

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

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

为方便起见,以下是MyClass实施的示例:

class MyClass : NSObject {
    var someProperty : Double = 0.0

    func updateValue() {
        someProperty += 10.0
    }
}

1 个答案:

答案 0 :(得分:3)

问题是MyClass是引用类型。复制字典时,它确实会创建字典的新副本,但新副本引用了原始字典所具有的MyClass的相同实例。对任何地方MyClass实例的引用副本所做的更改,无论是在字典内还是在任何其他值类型中,都将反映在同一MyClass实例的任何其他引用中。< / p>

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