2016-07-26 6 views
0

Ich möchte zu überprüfen, ob der NSUserDefaults den Wert mit dem Schlüssel von dic hat, dann die Daten laden und in loadedDic speichern, wenn die Daten vorhanden sind, oder setzen Sie den Wert von loadedDic und speichern Sie in NSUserDefaults wenn nicht.NSUserDefaults.standardUserDefaults(). DictionaryForKey() zurückkehrt kompilieren Fehler

Die Aussage kommentiert mit error! gibt eine Fehlermeldung:

Wert des Typs nicht zuordnen können [String : AnyObject]? zu [String : [String]]

Ich dachte, es wäre in Ordnung, da der Rückgabetyp der Methode dictionaryForKey sagt AnyObject . Noch verstehe mich nicht voll diesen ANYOBJECT Typen :(

jemand erklären kann, was den Fehler macht und wie soll ich dieses Problem kümmern? Vielen Dank im Voraus.

Der folgende Codeblock in viewDidLoad() Methode ist . in einer UIViewController Klasse

var loadedDic = [String : [String]]() 

let defaults = NSUserDefaults.standardUserDefaults() 

if defaults.dictionaryForKey("dic") != nil { 
    print("there's the value i want") 
    loadedDic = defaults.dictionaryForKey("dic")//error! 
}else { 
    //some codes to set values of 'loadedDic'. this part works properly 

    defaults.setObject(loadedDic, forKey: "dic") 
    if defaults.synchronize(){ 
    print("saved") 
    } 
} 
+0

Verwenden Sie keine '.synchronize()', das ist veraltet. Die Standardwerte sind bereits gespeichert, sobald Sie '.setObject' ausführen. – Moritz

+0

Die Standardwerte werden nicht gespeichert, sobald '.setObject' aufgerufen wird. Siehe Dokument hier: https://developer.apple.com/reference/foundation/userdefaults/1414005-synchronize – yuji

Antwort

1

prüfen Art des Wörterbuchs von NSUserDefaults empfangen wird erwartet, Typ:

if defaults.dictionaryForKey("dic") != nil { 
    print("there's the value i want") 
    if let dic = defaults.dictionaryForKey("dic") as? [String : [String]]{ 
     loadedDic = dic 
    } 
} 
+0

Sie brauchen nicht einmal zuerst "if" hier – sage444

0

versuchen

 var loadedDic = [String : AnyObject]() 

statt

var loadedDic = [String : [String]]() 
+0

dieser funktioniert nicht. Die Fehlermeldung sagt genau das gleiche wie die Nachricht in der Frage; "Kann [String: AnyObject]] keinen Wert vom Typ [String: AnyObject] zuweisen". Beachten Sie, dass der Wert ein Array von String ist. –

+0

überprüfen Sie aktualisierte Antwort !!! Wenn es funktioniert !! – Lion

-1

Sie haben es wie auf diese Weise zu tun.

var loadedDic = Dictionary<String, AnyObject>() 

nun zum Zeitpunkt des Abrufens Wörterbuch von NSUserDefault

let defaults = NSUserDefaults.standardUserDefaults() 

if let dic : Dictionary<String, AnyObject> = defaults.dictionaryForKey("dic") as! Dictionary<String, AnyObject> 
{ 
    loadedDic = defaults.dictionaryForKey("dic") 
} 
else 
{ 
    //some codes to set values of 'loadedDic'. this part works properly 
    // Make sure you store it in Dictionary<String, AnyObject>() manner 

    defaults.setObject(loadedDic, forKey: "dic") 
    if defaults.synchronize(){ 
     print("saved") 
    } 
}