我可以在UserDefaults上存储哪种字典或数组有限制吗?

时间:2017-02-20 08:43:42

标签: swift dictionary nsuserdefaults

我有一个来自Json的Dictionary我希望存储在UserDefaults,但我收到错误Attempt to set a non-property-list object <object description here> as an NSUserDefaults/CFPreferences value for key info

问题是,我的Dictionary是一个多级嵌套Dictionary,里面也有Array。但是在叶子节点上,所有都只是String。这大致是结构。

{
    data: {
        field1: "...",
        field2: "...",
        field3: [
            {
                info1: "...",
                info2: "...",
                info3: "..."
            },
            {
                info1: "...",
                info2: "...",
                info3: "..."
            }
        ]
    }
}

此格式是否无法存储到UserDefaults

感谢。

编辑:当我缩小问题范围时,似乎问题出现在field3的各行中。当我尝试保存field3 ex:field3[0]的单个行的字典时,它给了我同样的错误。但是如果我删除整个json并删除field3(设置为nil),我就没问题了。

以下是field3行的实际内容。

{
    "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";
}

2 个答案:

答案 0 :(得分:3)

我们可以设置字典,它就像字符串,数组里面的内容并不重要。

目标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实例。

答案 1 :(得分:0)

只要您使用DictionaryUserDefaults Documentation中列出的其他受支持的数据类型,您就可以了。如果是这种情况并且仍然会出错,则表示您正在错误地构建字典。

此解决方案正常运行:

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()