我遇到了以下问题。
我有一个名为 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
}
}
答案 0 :(得分:3)
问题是MyClass
是引用类型。复制字典时,它确实会创建字典的新副本,但新副本引用了原始字典所具有的MyClass
的相同实例。对任何地方MyClass
实例的引用副本所做的更改,无论是在字典内还是在任何其他值类型中,都将反映在同一MyClass
实例的任何其他引用中。< / p>
基本上,字典是一种值类型,这意味着它具有值语义。但是字典中的值是引用类型,因此它们具有引用语义。解决这个问题的唯一方法是为字典中的每个键创建一个带有新MyClass
实例的字典。或者,正如@EricD建议的那样,使用结构而不是类来获取值语义你想要的。