Ich habe ein folgendes Problem.Wie verhindert man das Ändern einer Kopie des Wörterbuchs
Ich habe eine Funktion A genannt, die eine folgende Wörterbuch als Argument [String : MyClass]
, wo MyClass eine benutzerdefinierte Klasse, die ich angelegt habe (es ist eine Unterklasse von NSObject
). MyClass hat eine Eigenschaft namens firstProperty.
Funktion A sieht so aus:
func A (someDictionary : [String : MyClass]) {
var someDictionaryCopy = someDictionary
someDictionaryCopy["Key"].updateValue()
}
Ok, also die erste Zeile im Körper der Funktion A ist das Kopieren der someDictionary, die der Funktion A. geleitet Aber ich DON‘ Sie möchten das ursprüngliche someDictionary ändern oder ändern.
Die zweite Zeile: Ich nehme einige vorhandene Wert im Wörterbuch und führen Sie eine Methode auf MyClass-Instanz, die eine seiner Eigenschaften ändert.
Die Sache ist, dass, wenn ich den obigen Code ausführen, das ursprüngliche Wörterbuch, das an die Funktion übergeben wird, auch geändert wird? Wieso ist es so? Wie kann ich ein Wörterbuch an die Funktion übergeben, so dass es nicht mutiert ist?
Für Ihre Bequemlichkeit ist hier eine Probe von MyClass Umsetzung:
class MyClass : NSObject {
var someProperty : Double = 0.0
func updateValue() {
someProperty += 10.0
}
}
Swift Wörterbücher sind Werttyp - das Original wird * nicht * geändert, wenn Sie eine Kopie aktualisieren. Dies ist das Gegenteil von NSDictionary, das * referenz * type ist. In Ihrem Swift-Wörterbuch haben Sie jedoch eine * Klasse *: Diese sind Referenztypen und werden von der Kopie aktualisiert. – Moritz
Ok, also wie kopiere ich ein Wörterbuch, damit die darin enthaltenen Werte nicht verändert werden? – phbelov
Sie sollten nicht mit Klassen arbeiten, wenn Sie kein Referenzverhalten wünschen, sondern stattdessen Strukturen. Wenn Sie jedoch Klassen verwenden, sollten Sie das Referenzsystem verwenden. Das ist mein Vorschlag. :) – Moritz