首页 > 解决方案 > 将字符串和 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 和字符串,对吧?这里没有异国情调吗?

标签: iosswiftnsarraynsuserdefaultsnsurl

解决方案


来自Apple 的文档

value 参数只能是属性列表对象:NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。对于 NSArray 和 NSDictionary 对象,它们的内容必须是属性列表对象。

在您的情况下,似乎最简单的解决方案就是存储 URL 的字符串值,或者使用NSKeyedArchiver.

正如您在评论中指出的那样,有一种方法setUrl:forKey,但如果您阅读文档并检查“讨论”部分,您可以看到该方法将 URL 转换为要存档的字符串,然后在检索对象时执行相反的操作之后。当 URL 位于数组或字典的内容中时,根据上述内容,情况并非如此。


推荐阅读