Swift 我可以在UserDefaults上存储什么样的字典或数组有什么限制吗?

Swift 我可以在UserDefaults上存储什么样的字典或数组有什么限制吗?,swift,dictionary,nsuserdefaults,Swift,Dictionary,Nsuserdefaults,我有一个来自Json的字典,我想将它存储在UserDefaults上,但我得到错误尝试将非属性列表对象设置为密钥信息的NSUserDefaults/CFPreferences值 问题是,我的字典是一个多层嵌套的字典,里面也有数组。但是在叶节点上,所有的都是字符串。这大致就是结构 { data: { field1: "...", field2: "...", field3: [ { in

我有一个来自Json的
字典
,我想将它存储在
UserDefaults
上,但我得到错误
尝试将非属性列表对象设置为密钥信息的NSUserDefaults/CFPreferences值

问题是,我的
字典
是一个多层嵌套的
字典
,里面也有
数组
。但是在叶节点上,所有的都是
字符串
。这大致就是结构

{
    data: {
        field1: "...",
        field2: "...",
        field3: [
            {
                info1: "...",
                info2: "...",
                info3: "..."
            },
            {
                info1: "...",
                info2: "...",
                info3: "..."
            }
        ]
    }
}
此格式是否不能存储到
UserDefaults

谢谢

编辑:当我缩小问题范围时,问题似乎出现在
字段3
的单独一行中。当我试图保存
field3
ex:
field3[0]
的单个行的字典时,它给出了相同的错误。但是如果在删除
字段3
的情况下保存整个json(设置为nil),则没有问题

以下是一行
字段3
的实际内容

{
    "app_setting" = "app_setting_1";
    "created_at" = "2017-02-02 19:54:46";
    "feedback_name" = "No Toilet Paper";
    "feedback_option" = 1;
    id = "feedback_option_11";
    property = "property_1";
    sn = "<null>";
    "updated_at" = "2017-02-02 19:54:46";
    "url_image_option" = "https://example.com/assets/ios/option1.png";
}
{
“应用程序设置”=“应用程序设置1”;
“创建时间”=“2017-02-02 19:54:46”;
“反馈_name”=“无卫生纸”;
“反馈_选项”=1;
id=“反馈选项11”;
property=“property_1”;
sn=“”;
“更新时间”=“2017-02-02 19:54:46”;
“url_图像_选项”=”https://example.com/assets/ios/option1.png";
}

我们可以设置字典,不管里面有什么,比如字符串、数组

目标C

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
[currentDefaults setObject:urDictionary forKey:@"yourKeyName"];

NSUserDefaults *retrieveDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *data1 = [retrieveDefaults objectForKey:@"yourKeyName"];
首先确定那是一本字典

将对象转换为NSData的步骤

NSData*data=[NSKeyedArchiver archivedDataWithRootObject:urObject]

检索对象

NSData *data1 = [retrieveDefaults objectForKey:@"yourKeyName"];
urObject *retrievedModel = [NSKeyedUnarchiver unarchiveObjectWithData:data1];
Swift 3.0

将字典转换为数据的步骤

let dataExample: Data = NSKeyedArchiver.archivedData(withRootObject: dictionaryExample)
NSUserDefaults.standardUserDefaults().setObject(dataExample, forKey:"yourKey")
要检索数据,请执行以下操作:

NSUserDefaults.standardUserDefaults().objectForKey("yourKey") as! NSDate
let dictionary: Dictionary? = NSKeyedUnarchiver.unarchiveObject(with: dataExample) as! [String : Any]
以下是苹果公司的说法

NSUserDefaults类为访问常见类型(如浮点、双精度、整数、布尔和URL)提供了方便的方法。默认对象必须是属性列表,即NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary的实例(或集合的实例组合)。如果要存储任何其他类型的对象,通常应将其存档以创建NSData实例


只要您使用的是
字典
或中列出的其他受支持的数据类型,您就可以了。如果是这种情况,并且它仍然给出一个错误,那么您构建的字典是错误的

此解决方案效果良好:

let dict: [String:Dictionary] = [
            "data": [
                "field1":["a","b","c"],
                "field2":["d","e","f"]
            ],
            "otherData": [
                "field1":["g","h","i"],
                "field2":["j","k","l"]
            ]
        ]

UserDefaults.standard.set(dict, forKey: "dict")
UserDefaults.standard.synchronize()

但根据本文中的文章,您可以将字典和数组保存到UserDefaults中。我要保存的是字典,里面有数组。好的,我知道了,你指定了一个字典,但是字段3有一个字典数组,类型是
Any
,所以你需要指定
let dict:[String:[[String:String]]]]
或者继续将你的字典转换成NSData你可以将字典转换成NSData吗?这简化了一切。等等,让我试试。好的,它通过转换数据然后再转换回来来工作。这就是我所需要的。如果成功了,就成功了。不管这是不是一个解决办法哈哈。谢谢!您发布的代码是否正是您试图设置为字典的代码?请注意,
id
property
sn
不是字符串,因此不能是字典键。这是打印到对象控制台的文本结果,因为它是一个字典,所以可以生成这样的对象描述。