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