【发布时间】:2021-01-17 23:15:34
【问题描述】:
我有一个array 类型为[NotificationTriggers],我想将它存储在userdefaults 中。为此,数据需要为encoded 和decoded。我在这里学习了教程:
https://cocoacasts.com/ud-5-how-to-store-a-custom-object-in-user-defaults-in-swift
这里:
但我仍然收到一个似乎无法解决的错误。
我有一个 extension 或 userDefaults,我在变量的 get 和 set 中施展魔法。 NotificationTriggers Struct 看起来像这样:
struct NotificationTriggers: Equatable, Codable {
var doorName: String
var notificationTrigger: String
}
Encoding 似乎工作,但在 decoding 我得到一个 error 说
无法将“[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'"
不确定这里缺少什么。有什么想法吗?
【问题讨论】:
-
self.array(forKey:=>self.data(forKey:和[NotificationTriggers]?.self=>[NotificationTriggers].self应该可以解决问题。另外,在catch中,不要什么都不做,而是:catch { print("Error while doingSomethingToCustomizeHere :\(error)") }
标签: ios swift encoding decoding userdefaults