Aktualizacja Swift 2, Xcode 7: W @atxe zauważył, słowniki NSUserDefaults obecnie odwzorowywane jako [String, AnyObject]
. Jest to konsekwencją Objective-C „lekkich rodzajowych”, które pozwalają zadeklarować metodę Objective-C, jak
- (NSDictionary<NSString *,id> *)dictionaryForKey:(NSString *)defaultName
(domyślnych obiektów musi być listami własności, aw szczególności słowniku klucze mogą być tylko ciągi .)
z drugiej strony, Swift słownika mostkiem automatycznie, jeśli to możliwe, więc oryginalny kod od kwestii działa (ponownie):
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)
Oryginalna odpowiedź dla Swift 1.2: Domyślne ustawienia użytkownika mogą przechowywać obiekty NSDictionary
. Są one odwzorowane na Swift jak [NSObject : AnyObject]
:
var jo : [NSObject : AnyObject] = [
"a" : "1.0",
"b" : "2.0"
]
userDefaults.setObject(jo, forKey: akey)
var isOk = userDefaults.synchronize()
i zauważ, że dictionaryForKey()
zwraca opcjonalny, więc należy to sprawdzić na przykład z opcjonalnym Zadanie:
if let data0 = userDefaults.dictionaryForKey(akey) {
print(data0)
} else {
print("not set")
}
// Output: [b: 2.0, a: 1.0]
zaraz! kluczem jest jawne zadeklarowanie: var jo: [NSObject: AnyObject] jak wspomniano powyżej. – Sean
Innym sposobem (w przypadku, gdy z jakiegoś powodu nie można podać oświadczenia jawnie) byłoby użycie "jak NSDictionary": userDefaults.setObject ((jo as NSDictionary), forKey: aKey) – winterized
W Swift 2.0 NSUserDefault są zmapowane słowniki jako [String: AnyObject].W rzeczywistości, jeśli spróbujesz zapisać słownik z Int (na przykład) jako klucz, nie powiedzie się on w czasie wykonywania. Możesz zdefiniować swoje rozszerzenie za pomocą silnej metody pisania, aby bezpiecznie wspierać i unikać możliwego błędu w czasie wykonywania, chociaż byłoby miło mieć tak trywialną metodę dostarczoną przez Apple. – atxe