2016-07-26 16 views
0

Ich habe eine Reihe von Wörterbüchern in einem Wörterbuch. Ich initialisieren es wie folgt aus:iOS Swift Updating Wörterbuch in einem Array

var fillups:[NSMutableDictionary] = [] 

Dann habe ich es wie folgt laden:

fillups = userDefaults.object(forKey: car) as! NSArray as! [NSMutableDictionary] 

Dann, wenn ich versuche, ein Wörterbuch Element im Array zu aktualisieren ich die „mutiert Methode unveränderliches Objekt gesendet“ erhalten Error. Hier ist mein Code, um den Datensatz zu aktualisieren:

let dict=fillups[row] 
dict.setValue(odometerField.text, forKey: "odometer") 
dict.setValue(gallonsField.text, forKey: "gallons") 
fillups[row]=dict 

Der Fehler tritt in meiner ersten SetValue-Zeile.

+3

'wie! NSArray als! [NSMutableDictionary] 'Es ist fast so, als wolltest du * das eines Tages abstürzen. ;) Bitte nicht auspacken und nicht gewaltsam werfen. Verwenden Sie eine optionale Bindung ('if let') oder andere sichere Auspacktechniken. – Moritz

+0

Das war eigentlich die Syntax, die Xcode verlangte. Allerdings habe ich es auf dieses fillups = userDefaults.object (forKey: car) als geändert! [NSMutableDictionary] und Xcode gefiel das. Immer noch das gleiche Problem. –

+0

Dann Xcode war schlecht benehmen. Manchmal macht es das ... Machtcasts sind schon etwas, das man so oft wie möglich verbieten sollte. Wenn man also einen * doppelten * Machtwurf sieht, weiß man *, dass etwas sehr falsch ist, und meistens muss man das Problem angehen dich selber. :) – Moritz

Antwort

0

Objekte, die Sie aus NSUserDefaults abrufen unveränderlich sind, auch wenn sie wandelbar waren, als sie eingefügt wurden. Sie müssen die unveränderlichen Objekte, die Sie von Standardwerten erhalten, verwenden und änderbare Versionen von ihnen erstellen. Sie sollten auch nicht überall Unwrap erzwingen, wenn Sie nicht möchten, dass Ihre App abstürzt.

if let array = userDefaults.object(forKey: car) as? [NSDictionary] { 
    fillups = array.map { ($0.mutableCopy() as! NSMutableDictionary) } 
} 

Sie auch brauchen nicht die fillips[row] = dict Linie seit NSMutableDictionary eine Art Referenz und Bearbeitung der Referenz, die Sie aus der Reihe ziehen bereits die eine in der Array bearbeiten.

+0

Perfekt! Das hat super funktioniert! –

0

Wenn Sie Ihr Diktat mutieren möchten, müssen Sie es mit 'var' nicht mit 'let' deklarieren; 'Let' ist für Konstanten. Auch fix wiesen die Auswickeln Probleme durch den Kommentar aus

let dict=fillups[row] 

sollte

var dict=fillups[row]