Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Xcode和Swift将嵌套字典保存到用户默认值_Swift_Xcode_Nsuserdefaults_Nsdata - Fatal编程技术网

使用Xcode和Swift将嵌套字典保存到用户默认值

使用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

我正在尝试用userDefaults保存嵌套字典。 当我试图以常规方式保存应用程序时,应用程序崩溃,即

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:)
,可能存在以下重复项: