Swift NSUserDefaults не сохраняет словарь?
У меня есть следующий тестовый код:
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)
}
Вывод println (data0) равен нулю.
Что-то не так с моим кодом? Является ли Swift Dictionary рассмотрен список свойств сейчас или в финальной версии?
Ответы
Ответ 1
Обновление для Swift 2, Xcode 7: Как заметил @atxe, словари NSUserDefaults теперь отображаются как [String, AnyObject]
. Это
следствием Objective-C "легких генераторов", которые позволяют
объявить метод Objective-C как
- (NSDictionary<NSString *,id> *)dictionaryForKey:(NSString *)defaultName
(Объекты по умолчанию должны быть списками свойств и, в частности, словарем
ключи могут быть только строками.)
С другой стороны, словарь Swift автоматически соединяется по возможности, поэтому исходный код из вопроса работает (снова):
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)
Оригинальный ответ для Swift 1.2:
Пользовательские значения по умолчанию могут хранить объекты NSDictionary
. Они отображаются на Swift
как [NSObject : AnyObject]
:
var jo : [NSObject : AnyObject] = [
"a" : "1.0",
"b" : "2.0"
]
userDefaults.setObject(jo, forKey: akey)
var isOk = userDefaults.synchronize()
И обратите внимание, что dictionaryForKey()
возвращает необязательный параметр, поэтому вы должны его проверить
например, с необязательным присваиванием:
if let data0 = userDefaults.dictionaryForKey(akey) {
print(data0)
} else {
print("not set")
}
// Output: [b: 2.0, a: 1.0]
Ответ 2
Сначала вам нужно преобразовать его в NSData
. Что-то вроде этого:
var data = NSKeyedArchiver.archivedDataWithRootObject(jo)
var userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setObject(data, forKey:akey)
Ответ 3
Вчера я столкнулся с этой проблемой и подал радар: Невозможно хранить словарь в NSUserDefaults в iOS8. Эта проблема связана только с iOS 8. Также я описал обходной путь для этого случая: Временное решение для сохранения словаря в NSUserDefaults. Работает как шарм.
/// 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
Следуйте этому красивому коду ниже → 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;
}
Ответ 5
//swift 4.0
//для сохранения
let userDefaults = UserDefaults.standard
userDefaults.setValue(value, forKey: "Your_Key")
userDefaults.synchronize()
//для получения
let loadedCart = UserDefaults.standard.dictionary(forKey: "Your_Key")