2016-05-04 4 views
0

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 
    } 
} 
+4

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

+0

Ok, also wie kopiere ich ein Wörterbuch, damit die darin enthaltenen Werte nicht verändert werden? – phbelov

+2

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

Antwort

3

Das Problem ist, dass MyClass ist ein Referenztyp. Wenn Sie das Wörterbuch kopieren, erstellt es tatsächlich eine neue Kopie des Wörterbuchs, aber die neue Kopie enthält Verweise auf dieselben Instanzen von MyClass, die das ursprüngliche Wörterbuch hat. Änderungen an einer Kopie eines Verweises auf eine Instanz von MyClass, unabhängig davon, ob sie sich in einem Wörterbuch oder einem anderen Werttyp befinden, werden in jedem anderen Verweis auf dieselbe Instanz von MyClass wiedergegeben.

Grundsätzlich ist das Wörterbuch ein Werttyp, was bedeutet, dass es Wert Semantik hat. Aber die Werte im Wörterbuch sind Referenztypen, daher haben sie Referenzsemantik. Der einzige Weg, um dies zu erreichen, ist ein Wörterbuch mit neuen Instanzen von MyClass für jeden Schlüssel im Wörterbuch zu erstellen. Oder, wie @EricD vorgeschlagen hat, verwenden Sie Strukturen anstelle von Klassen, um die gewünschte Wertesemantik zu erhalten.

Verwandte Themen