ios - 如何解码对象数组并从 userdefaults 中检索它?
问题描述
我有一个我想存储的array
with 类型。为此,数据需要是和。我在这里遵循了教程:[NotificationTriggers]
userdefaults
encoded
decoded
https://cocoacasts.com/ud-5-how-to-store-a-custom-object-in-user-defaults-in-swift
和这里:
但我仍然收到一个我似乎无法解决的错误。
我有一个我在变量的获取和设置中发挥魔力的地方extension
。看起来像这样:userDefaults
NotificationTriggers
Struct
struct NotificationTriggers: Equatable, Codable {
var doorName: String
var notificationTrigger: String
}
Encoding
似乎有效,但在decoding
我得到一个error
说法
无法将类型“[Any]”的值转换为预期的参数类型“数据”
这是代码:
extension UserDefaults {
var notificationTrigger: [NotificationTriggers] {
get {
if let data = self.array(forKey: UserDefaultsKey.notificationTrigger.rawValue) {
do {
let decoder = JSONDecoder()
//CODE BELOW PRODUCE ERROR
if let decodedData = try decoder.decode([NotificationTriggers]?.self, from: data) {
return decodedData
}
} catch { }
}
return []
}
set {
do {
let encoder = JSONEncoder()
let data = try encoder.encode(newValue)
self.setValue(data, forKey: UserDefaultsKey.notificationTrigger.rawValue)
} catch { }
}
}
}
我试过casting
数据:
UserDefaultsKey.notificationTrigger.rawValue) as? Data // get warning "Cast from '[Any]?' to unrelated type 'Data' always fails"
UserDefaultsKey.notificationTrigger.rawValue) as? [NotificationTriggers] // get error "Cannot convert value of type '[NotificationTriggers]' to expected argument type 'Data'"
不确定这里缺少什么。有任何想法吗?
解决方案
您可以通过以下方式保存Data
密钥UserDefaultsKey.notificationTrigger.rawValue
:
let encoder = JSONEncoder()
let data = try encoder.encode(newValue)
self.setValue(data, forKey: UserDefaultsKey.notificationTrigger.rawValue)
所以我看到的第一个错误:
if let data = self.array(forKey: UserDefaultsKey.notificationTrigger.rawValue) {
array(forKey:)
? 不,data(forKey:)
,您没有保存Array
a ,您保存了 a Data
, aData
可能在解码后“隐藏” an Array
,但系统不知道。所以,它应该是:
if let data = self.data(forKey: UserDefaultsKey.notificationTrigger.rawValue) {
然后:
let decodedData = try decoder.decode([NotificationTriggers]?.self, from: data)
=>
let decodedData = try decoder.decode([NotificationTriggers].self, from: data)
另外,有这个坏习惯catch { }
,如果有错误,你可能想知道它:
catch {
print("Error while doingSomethingToCustomizeHere: \(error)")
}
推荐阅读
- python - 2D Array update 实际上更新了两个不同的数组?
- c++ - Visual Studio:解决项目依赖项的构建标志/设置
- reactjs - Nextjs api“pages/api”在 vercel 服务器上不起作用
- kotlin - Kotlin MockK 抛出 NullPointerException
- google-cloud-platform - 谷歌云监控 - 设置自定义监控
- python - numpy 数组的条件语句
- java - 这个 IntelliJ 检查警告是误报吗?
- flutter - 令人困惑的函数声明语法
- php - 使用带有标志和回调的 filter_input_array 时语法正确吗?
- monitoring - 使用 Prometheus 和 Grafana 监控基础架构堆栈