Ios 将字符串和URL的快速数组保存到NSUserDefaults会导致崩溃,为什么/如何修复?
我的阵型很快。此数组中的每个项都是由两个项组成的“子数组”,一个字符串和一个URL。所以Swift类型是Ios 将字符串和URL的快速数组保存到NSUserDefaults会导致崩溃,为什么/如何修复?,ios,swift,nsarray,nsuserdefaults,nsurl,Ios,Swift,Nsarray,Nsuserdefaults,Nsurl,我的阵型很快。此数组中的每个项都是由两个项组成的“子数组”,一个字符串和一个URL。所以Swift类型是[[Any]],例如,它可能看起来像这样: [ ["hlors", URL(string: "https://google.com")!], ["qtvmr", URL(string: "https://bing.com"!)] ] 当我尝试将其保存到NSUserDefaults时: UserDefaults.standard.set(items, forKey: DefaultsKeys.
[[Any]]
,例如,它可能看起来像这样:
[ ["hlors", URL(string: "https://google.com")!], ["qtvmr", URL(string: "https://bing.com"!)] ]
当我尝试将其保存到NSUserDefaults时:
UserDefaults.standard.set(items, forKey: DefaultsKeys.subredditIcons)
我得到以下错误:
[用户默认值]尝试将非属性列表对象(…)设置为键TestKey123的NSUserDefaults/CFPreferences值
我做错了什么?NSUserDefaults应该能够保存URL和字符串,对吗?这里没有什么异国情调?来自:
值参数只能是属性列表对象:NSData,
NSString、NSNumber、NSDate、NSArray或NSDictionary。对于NSArray和
NSDictionary对象,其内容必须是属性列表对象
在您的例子中,似乎最简单的解决方案就是存储URL的字符串值,或者使用NSKeyedArchiver
正如您在评论中指出的那样,有一种方法可用于
setUrl:forKey
,不过如果您阅读并查看“讨论”部分,您会发现该方法将URL转换为要存档的字符串,然后在以后检索对象时会执行相反的操作。如上所述,如果URL位于数组或字典的内容中,则不会出现这种情况。请查看的文档<代码>URL(或NSURL
)未列在plist兼容类型中-NSData
、NSString
、NSNumber
、NSDate
、NSArray
或NSDictionary
@OOPer什么?NSUserDefaults上有一个setURL方法。不幸的是,该方法的存在并不意味着UserDefaults
可以包含URL
。该方法将NSURL
转换为plist兼容类型(NSString
或NSData
)之一,并将其存储到UserDefaults
,但除非有明确的文档记录,否则没有其他方法不会进行这种转换。您可能需要自己转换URL。