Swift NSUserDefaults ne pas sauvegarder le dictionnaire?

j'ai le code de test suivant:

  func testSaveDictionary() {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    var jo = [
      "a" : "1.0",
      "b" : "2.0"
    ]

    let akey = "aKey"
    userDefaults.setObject(jo, forKey: akey)
    var isOk = userDefaults.synchronize()

    var data0 = userDefaults.dictionaryForKey(akey)
    println(data0)

  }

la sortie de println (data0) est nulle.

quelque chose ne va pas avec mon code? Le dictionnaire Swift est-il considéré comme une liste de propriétés maintenant ou dans la version finale?

21
demandé sur Sean 2014-09-09 23:45:24

5 réponses

mise à jour pour Swift 2, Xcode 7: @atxe remarqué, NSUserDefaults dictionnaires sont maintenant connecté en tant que [String, AnyObject]. C'est un conséquence de L'objectif - c "génériques légers" qui permettent déclarer la méthode Objective-C comme suit:--11-->

- (NSDictionary<NSString *,id> *)dictionaryForKey:(NSString *)defaultName

(les objets par défaut doivent être des listes de propriétés et en particulier le dictionnaire les clés ne peuvent être que des cordes.)

d'un autre côté, un dictionnaire Swift est relié automatiquement si possible, de sorte que le code original la question des œuvres (encore une fois):

let jo = [
    "a" : "1.0",
    "b" : "2.0"
]

let akey = "aKey"
// Swift 2:
userDefaults.setObject(jo, forKey: akey)
// Swift 3:
userDefaults.set(jo, forKey: akey)

réponse originale pour Swift 1.2: L'utilisateur par défaut peut stocker NSDictionary objets. Ces cartes sont celles de Swift [NSObject : AnyObject]:

var jo : [NSObject : AnyObject] = [
    "a" : "1.0",
    "b" : "2.0"
] 
userDefaults.setObject(jo, forKey: akey)
var isOk = userDefaults.synchronize()

Et notez que dictionaryForKey() renvoie une option, vous devez le vérifier par exemple, avec une option d'affectation:

if let data0 = userDefaults.dictionaryForKey(akey) {
    print(data0)
} else {
    print("not set")
}

// Output: [b: 2.0, a: 1.0]
30
répondu Martin R 2018-01-15 07:57:38

Vous devez le convertir en NSData dans un premier temps. Quelque chose comme ceci:

var data = NSKeyedArchiver.archivedDataWithRootObject(jo)
var userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setObject(data, forKey:akey) 
11
répondu Anthony Kong 2014-09-09 20:13:27

j'ai fait face à ce problème hier et j'ai déposé un radar: Cannot store Dictionary in Nsuerdefaults in iOS8. Cette question n'est liée qu'à iOS 8. J'ai aussi décrit une solution pour cette affaire:solution de contournement pour sauvegarder le dictionnaire dans NSUserDefaults. Fonctionne comme un charme.

/// Save
NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(object), forKey: key)

/// Read
var data = NSUserDefaults.standardUserDefaults().objectForKey(key) as NSData
var object = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [String: String]
4
répondu Tomasz Szulc 2016-09-09 01:39:31

//swift 4.0

//pour la sauvegarde

    let userDefaults = UserDefaults.standard
    userDefaults.setValue(value, forKey: "Your_Key")
    userDefaults.synchronize()

//pour récupérer

        let loadedCart = UserDefaults.standard.dictionary(forKey: "Your_Key")
2
répondu Shashi Verma 2017-07-26 09:18:03

suivez ce beau code ci-dessous - > Swift 3

public func setDict(dict: NSDictionary) {
    let data = NSKeyedArchiver.archivedData(withRootObject: dict)
    let userDefaults = UserDefaults.standard
    userDefaults.set(data, forKey:"keyHere")
}


public func getDict() -> NSDictionary {
    let data = UserDefaults.standard.object(forKey: "keyHere") as! NSData
    let object = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as! NSDictionary
    return object;
}
2
répondu Matheus Domingos 2017-08-09 20:52:53