使用Xcode和Swift将嵌套字典保存到用户默认值
我正在尝试用userDefaults保存嵌套字典。 当我试图以常规方式保存应用程序时,应用程序崩溃,即使用Xcode和Swift将嵌套字典保存到用户默认值,swift,xcode,nsuserdefaults,nsdata,Swift,Xcode,Nsuserdefaults,Nsdata,我正在尝试用userDefaults保存嵌套字典。 当我试图以常规方式保存应用程序时,应用程序崩溃,即 defaults.set(totalBuy, forKey: "test") 我得到了这个错误: 由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试插入非属性列表对象” 当我尝试将其转换为NSData,然后尝试检索它时,它总是返回为nil 代码如下: var buyData = [Int : String]() var bu
defaults.set(totalBuy, forKey: "test")
我得到了这个错误:
由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试插入非属性列表对象”
当我尝试将其转换为NSData,然后尝试检索它时,它总是返回为nil
代码如下:
var buyData = [Int : String]()
var buyingTotal = [String : [Int: String]]()
var totalBuy = [Int : [String : [Int: String]]]()
let buyerDict = defaults.dictionary(forKey: "buyerDict")
let test = defaults.dictionary(forKey: "test")
有人能帮我吗?您的字典需要将key Int更改为String或将字典转换为数据并检索它 尝试此方法从userdefault设置并获取您的值
let USERDEFAULT = UserDefaults.standard
class func setUserValueArchiver(value:Any, key :String) -> Void{
guard !(value is NSNull) else {
return
}
do{
let archive = try NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: true)
USERDEFAULT.set(archive, forKey: key)
USERDEFAULT.synchronize()
}catch let error{
Log("Error Save in UserDefault \(error.localizedDescription)")
}
}
class func getUserUnArchiveData(key : String) -> Any?{
if let userdata = USERDEFAULT.object(forKey: key) as? Data{
do{
let unarchived = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(userdata)
return unarchived
}catch let error{
Log("Error At Get UserDATA :\(error.localizedDescription)")
}
}
return nil
}
有两种方法可以让它工作 1。您可以使用
jsonecoder()
和JSONDecoder()
从字典
对象获取数据,即
要从totalBuy
获取数据
if let data = try? JSONEncoder().encode(totalBuy) {
defaults.set(data, forKey: "buyerDict")
}
let data = try? NSKeyedArchiver.archivedData(withRootObject: totalBuy)
defaults.set(data, forKey: "buyerDict")
要从数据
获取词典
if let data = defaults.data(forKey: "buyerDict"), let dict = try? JSONDecoder().decode([Int:[String:[Int:String]]].self, from: data) {
print(dict)
}
if let data = defaults.data(forKey: "buyerDict") {
let dict = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
print(dict)
}
2.如果您仍然想使用NSKeyedArchiver
和NSKeyedArchiver
,那就来吧
要从totalBuy
获取数据
if let data = try? JSONEncoder().encode(totalBuy) {
defaults.set(data, forKey: "buyerDict")
}
let data = try? NSKeyedArchiver.archivedData(withRootObject: totalBuy)
defaults.set(data, forKey: "buyerDict")
要从数据
获取词典
if let data = defaults.data(forKey: "buyerDict"), let dict = try? JSONDecoder().decode([Int:[String:[Int:String]]].self, from: data) {
print(dict)
}
if let data = defaults.data(forKey: "buyerDict") {
let dict = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
print(dict)
}
从UserDefaults
检索数据时,请使用数据(forKey:)
而不是对象(forKey:)
,可能存在以下重复项: