我有一个类型为 [NotificationTriggers]
的 array
,我想将其存储在 userdefaults
中。为此,需要对数据进行编码
和解码
。我在这里遵循了教程:
https://cocoacasts.com/ud-5-how-to-store-a-custom-object-in-user-defaults-in-swift
这里:
但我仍然遇到一个似乎无法解决的错误。
我有一个 userDefaults
的扩展
,我可以在其中实现变量的获取和设置。 NotificationTriggers
Struct
看起来像这样:
struct NotificationTriggers: Equatable, Codable {
var doorName: String
var notificationTrigger: String
}
编码
似乎有效,但在解码
中我收到一个错误
说
Cannot convert value of type '[Any]' to expected argument type 'Data'
这是代码:
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 { }
}
}
}
我尝试转换
数据:
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'"
不确定这里缺少什么。有什么想法吗?
最佳答案
您可以通过以下方式保存键UserDefaultsKey.notificationTrigger.rawValue
的Data
:
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) {
数组(forKey:)
?不,data(forKey:)
,你没有保存一个Array
,你保存了一个Data
,一个Data
> 经过一些解码后,可能会“隐藏”一个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)")
}
关于ios - 如何解码对象数组并从用户默认值中检索它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64168809/