2016-04-05 4 views
0

Ich habe zwei Wörterbücher. Beide werden in einem ViewController deklariert, beide basieren auf einer Modellstrukturklasse.Update-Wörterbuch mit zuvor gelöschten Elementen

// ItemDictionary 
var ItemDictionary = ItemModel() 
var JSONDictionary = ItemModel() 

JSON Daten werden in die JSONDictionary zugeführt und dann werden diese Daten an ItemDictionary geleitet, die einen Tisch innerhalb ViewDidLoad einspeist.

self.ItemDictionary = self.JSONDictionary 

Alles gut. Die Tabelle ist aus JSON-Daten gut gefüllt. Ich kann auch Elemente aus der Tabelle und dem ItemDictionary löschen. Wenn ich jedoch versuche, Elemente zurückzusetzen, indem ich auf das ursprüngliche Wörterbuch (JSONDictionary) verweise, ist das Element verschwunden.

Ich verstehe, dass dies erwartet wird. Wenn Dictionary1 = Dictionary2, wird ein neues Wörterbuch nicht tatsächlich erstellt. Nur eine zweite Adresse. Wenn Sie also Dictionary1 ändern, ändert sich auch Dictionary2.

Ein praktisches Beispiel könnte eine Preisspanne sein. Sie können den Bereich verkleinern und weniger Objekte auf dem Tisch anzeigen lassen. Sie können zuvor gelöschte Artikel jedoch nicht ersetzen, wenn Sie die Preisspanne erhöhen möchten. Ich möchte das JSON-Skript nicht jedes Mal erneut aufrufen, wenn ich den Bereich bearbeite. Beratung geschätzt.

+0

Sie können Elemente zu einem Wörterbuch hinzufügen. Zeigen Sie bitte Ihren Code. –

+0

Was ist der Typ, der von 'ItemModel()' zurückgegeben wird? Es klingt, als ob du ein 'NSMutableDictionary' statt eines Swift' Dictionary' verwendest. –

Antwort

0

Wie vom OP bestätigt, ist ItemModel eine Klasse und kein Dictionary. Um dies zu beheben, müssen Sie ItemModel einen echten Dictionary und damit einen Werttyp machen. Dies ist wahrscheinlich die bevorzugte Wahl, wird aber mehr Arbeit sein.

Eine Alternative wäre, der ItemModel-Klasse einen Convenience-Initialisierer hinzuzufügen, der eine neue Kopie von sich selbst instanziiert und diesen statt self.ItemDictionary = self.JSONDictionary aufruft.

So etwas wie das.

init(model: ItemDictionary) -> ItemDictionary { 
    // copy properties 
} 

Dann erstellen Sie die neue Kopie.

self.ItemDictionary = ItemDictionary(self.JSONDictionary)

Später können Sie ItemDictionary mit dem gleichen Anruf neu zu initialisieren.

0

diesen Code Versuchen out-

var dictionary1 = ["name": "Magnus"] 
var dictionary2 = dictionary1 
dictionary2.removeAll() 
print("\(dictionary2) \(dictionary1)") 

Die Ausgabe lautet: -

[:] ["name": "Magnus"] 

So 2 neue Wörterbücher erstellt werden. Wenn Sie sich auf die Swift-Dokumentation beziehen, werden Sie feststellen, dass Referenzen in swift kaum vorhanden sind. Ein anderer Teil des Codes könnte dafür verantwortlich sein. Hoffe das hilft :-)

+0

Das ist wahr, 'Dictionary' ist ein Werttyp und wird kopiert. ABER was ist 'ItemModel'? Ich vermute, dass es eine Klasse ist und daher "ItemDictionary" und "JSONDictionary" auf dasselbe Objekt zeigen. –

+0

Ja. Wenn sie Objekte sind, anstatt Daten zu löschen, entfernen Sie einfach den Verweis ItemDictionary (assign to nil). JSONDictionary behält also die Daten – Abhishek729

+0

Beide Wörterbücher zeigen auf das gleiche Objekt. – Magnus

Verwandte Themen