Ios 将字符串和URL的快速数组保存到NSUserDefaults会导致崩溃,为什么/如何修复?

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.

我的阵型很快。此数组中的每个项都是由两个项组成的“子数组”,一个字符串和一个URL。所以Swift类型是
[[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。