Ios 如何解码对象数组并从userdefaults检索它?
我有一个类型为Ios 如何解码对象数组并从userdefaults检索它?,ios,swift,encoding,decoding,userdefaults,Ios,Swift,Encoding,Decoding,Userdefaults,我有一个类型为[NotificationTriggers]的数组,我想将其存储在userdefaults中。为此,需要对数据进行编码和解码。我在这里学习了一些教程: 在这里: 但我仍然遇到一个我似乎无法解决的错误 我有一个的扩展的userDefaults,在这里我在变量的get和set中发挥了神奇的作用通知触发器结构如下所示: struct NotificationTriggers: Equatable, Codable { var doorName: String var
[NotificationTriggers]
的数组
,我想将其存储在userdefaults
中。为此,需要对数据进行编码
和解码
。我在这里学习了一些教程:
在这里:
但我仍然遇到一个我似乎无法解决的错误
我有一个的扩展
的userDefaults
,在这里我在变量的get和set中发挥了神奇的作用<代码>通知触发器
结构
如下所示:
struct NotificationTriggers: Equatable, Codable {
var doorName: String
var notificationTrigger: String
}
编码
似乎有效,但在解码
中,我收到一个错误
说
无法将“[Any]”类型的值转换为预期的参数类型“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 { }
}
}
}
我尝试了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'"
不知道这里少了什么。有什么想法吗?您可以为键
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) {
数组(forKey:)
?不,数据(forKey:)
,您没有保存一个数组
,您保存了一个数据
,一个数据
,在解码后可能会“隐藏”一个数组
,但系统不知道它。
因此,它应该是:
if let data = self.data(forKey: UserDefaultsKey.notificationTrigger.rawValue) {
然后:
=>
另外,有捕获{}
是一个坏习惯,如果有错误,您可能想知道:
catch {
print("Error while doingSomethingToCustomizeHere: \(error)")
}
self.array(forKey:
=>self.data(forKey:
和[NotificationTriggers]?.self
=>=>
应该起作用。另外,在catch
中,不要什么都不做,而是:catch{print(“在定制时出错:\(Error)”)
啊,很好,我今天学到了一些东西:)非常感谢你在@Larme上澄清了这一点
let decodedData = try decoder.decode([NotificationTriggers].self, from: data)
catch {
print("Error while doingSomethingToCustomizeHere: \(error)")
}