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?
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]
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)
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]
//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")
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;
}