Joa*_*edt 2 encoding decoding ios swift userdefaults
我有一个arraywith 类型[NotificationTriggers],我想存储在userdefaults. 为此,数据需要是encoded和decoded。我在这里遵循了教程:
https://cocoacasts.com/ud-5-how-to-store-a-custom-object-in-user-defaults-in-swift
和这里:
但我仍然收到一个我似乎无法解决的错误。
我有一个我在变量的 get 和 set 中施展魔法extension的userDefaults地方。NotificationTriggers Struct看起来像这样:
struct NotificationTriggers: Equatable, Codable {
var doorName: String
var notificationTrigger: String
}
Run Code Online (Sandbox Code Playgroud)
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 { }
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试过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'"
Run Code Online (Sandbox Code Playgroud)
不确定这里缺少什么。有任何想法吗?
您可以通过以下方式保存Data密钥UserDefaultsKey.notificationTrigger.rawValue:
let encoder = JSONEncoder()
let data = try encoder.encode(newValue)
self.setValue(data, forKey: UserDefaultsKey.notificationTrigger.rawValue)
Run Code Online (Sandbox Code Playgroud)
所以我看到的第一个错误是:
if let data = self.array(forKey: UserDefaultsKey.notificationTrigger.rawValue) {
Run Code Online (Sandbox Code Playgroud)
array(forKey:)? 不,data(forKey:),您没有保存Array,您保存了Data, aData可能经过一些解码“隐藏” an Array,但系统不知道。所以,应该是:
if let data = self.data(forKey: UserDefaultsKey.notificationTrigger.rawValue) {
Run Code Online (Sandbox Code Playgroud)
然后:
let decodedData = try decoder.decode([NotificationTriggers]?.self, from: data)
Run Code Online (Sandbox Code Playgroud)
=>
let decodedData = try decoder.decode([NotificationTriggers].self, from: data)
Run Code Online (Sandbox Code Playgroud)
另外,catch { }有一个坏习惯,如果有错误,你可能想知道它:
catch {
print("Error while doingSomethingToCustomizeHere: \(error)")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |