Aggiornamento per Swift 2, Xcode 7: Come @atxe notato, dizionari NSUserDefaults ora sono mappati come [String, AnyObject]
. Si tratta di una conseguenza della Objective-C "generici leggeri" che consentono per dichiarare il metodo Objective-C come
- (NSDictionary<NSString *,id> *)dictionaryForKey:(NSString *)defaultName
(oggetti di default deve essere elenchi di proprietà e, in particolare, il dizionario chiavi possono essere solo le stringhe .)
D'altra parte, un dizionario di Swift è colmato automaticamente, se possibile, in modo che il codice originale dalla questione lavora (di nuovo):
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)
Risposta originale per Swift 1.2: Le impostazioni predefinite dell'utente possono memorizzare gli oggetti NSDictionary
. Questi sono mappati Swift come [NSObject : AnyObject]
:
var jo : [NSObject : AnyObject] = [
"a" : "1.0",
"b" : "2.0"
]
userDefaults.setObject(jo, forKey: akey)
var isOk = userDefaults.synchronize()
e si noti che dictionaryForKey()
restituisce un optional, così si dovrebbe controllare ad esempio, con un incarico optional:
if let data0 = userDefaults.dictionaryForKey(akey) {
print(data0)
} else {
print("not set")
}
// Output: [b: 2.0, a: 1.0]
fonte
2014-09-09 20:28:46
proprio sopra! la chiave è dichiarare esplicitamente: var jo: [NSObject: AnyObject] come menzionato sopra. – Sean
Un altro modo (se per qualche motivo non è possibile rendere esplicita la dichiarazione) è utilizzare "come NSDictionary": userDefaults.setObject ((jo come NSDictionary), forKey: aKey) – winterized
In Swift 2.0 NSUserDefault i dizionari sono mappati come [String: AnyObject].In realtà se provi a salvare un dizionario con Int (ad esempio) come chiave, fallisce in runtime. Puoi definire la tua estensione con un metodo fortemente tipizzato per supportare in sicurezza ed evitare un possibile errore di runtime, sebbene sarebbe bello avere un metodo così banale fornito da Apple. – atxe