2017-08-21 3 views
0

Je souhaite enregistrer certaines valeurs dans UserDefaults. Et je suis en utilisant ce code pour sauverLes valeurs UserDefault sont manquantes

func SaveSettings(){ 
    let def = UserDefaults.standard 
    def.set("test", forKey: "Value1") 
    def.set(myString, forKey: "Value2") //value: test1 
    def.set(myInt, forKey: "Value3") //value: 25 
    def.set(myInt64, forKey: "Value4") //value: 103254 
    def.synchronize() //I've tried to remove this line 
} 

Après avoir sauvé j'utiliser ce code pour contrôler si mes valeurs sont enregistrées dans UserDefaults ou non

for (key, value) in UserDefaults.standard.dictionaryRepresentation() { 
     print("\(key) = \(value) \n") 
} 

Et voir ce résultat

{ 
    Value1 = test 
    Value2 = test1 
    Value3 = 25 
    Value4 = 103254 
} 

Il n'y a pas de problème jusqu'à maintenant. Mais après je redémarre l'application et regardez les valeurs UserDefaults je vois ce résultat

{ 
    Value1 = test 
    Value2 = 
} 

Comme vous le voyez Value3 ad Value4 sont manquants. Cependant Value2 et Value1 reste. mais la valeur de Value2 est manquante

+0

'def = UserDefaults.standart' ne compile pas, ce qui signifie que ce code ne peut pas être votre vrai code. –

+0

Désolé. Ce serait 'standard' –

+0

Avez-vous appelé' .removeObject (forKey:) 'n'importe où dans votre code? – nayem

Répondre

0

J'ai trouvé le problème.

SaveSettings() func ont appelé quand myInt et myInt64 's sont des valeurs nil et myString' s valeur est vide. D'une certaine manière, Value3 et Value4 sont supprimés ici. Je suppose que cela arrive parce que leur valeur est nil. Mais je ne suis pas sûr que ce soit la raison exacte. Lorsque vous exécutez votre application, la valeur de chaîne que vous avez définie dans Value1 sera enregistrée, mais les objets de chaîne n'obtiendront aucune valeur lors de l'exécution initiale de l'application.

+0

Oui. C'était la raison. La valeur de réglage de n'importe quelle clé dans 'UserDefaults' supprime les données correspondantes. Et stocker tout type 'Optional' dans' UserDefaults' est également une mauvaise pratique. Déballez votre 'Optional 'avant de les enregistrer dans' UserDefaults'. – nayem

0

Donc, vous devez vérifier myInt, myString, myInt64 ne sont pas néant avant d'enregistrer dans UserDefaults.standard.