ios - 将字符串和 URL 的 Swift 数组保存到 NSUserDefaults 会导致崩溃,为什么/如何修复?
问题描述
我有一个 Swift 数组。此数组中的每个项目都是两个项目的“子数组”,一个字符串和一个 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 和字符串,对吧?这里没有异国情调吗?
解决方案
来自Apple 的文档:
value 参数只能是属性列表对象:NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。对于 NSArray 和 NSDictionary 对象,它们的内容必须是属性列表对象。
在您的情况下,似乎最简单的解决方案就是存储 URL 的字符串值,或者使用NSKeyedArchiver
.
正如您在评论中指出的那样,有一种方法setUrl:forKey
,但如果您阅读文档并检查“讨论”部分,您可以看到该方法将 URL 转换为要存档的字符串,然后在检索对象时执行相反的操作之后。当 URL 位于数组或字典的内容中时,根据上述内容,情况并非如此。
推荐阅读
- java - VS代码无法识别同一目录java中的.class
- database - 全新安装后如何从 Oracle 11g 默认 DBF 文件中恢复数据?
- javascript - React markdown - 如何使用 react-markdown 或危险的 SetInnerHTML 获取第 n 个元素并附加另一个元素?
- c - 我的兰顿蚂蚁自动机算法有什么缺陷?
- python - 错误:使用 from sklearn.preprocessing import MinMaxScaler 时没有名为“sklearn”的模块
- ios - 为什么 clipsToBounds 会阻止子视图被触摸?
- c# - 既然 C# Array 类是抽象的,那么它是如何实例化的呢?
- android - ApkTool 将 java 文件拆分为多个文件
- templates - 在 Ansible 模板中使用变量
- arduino - Arduino Uno 和 HC-05:串行监视器上不显示任何输出