问题描述
我有一个类型为array
的{{1}},我想存储在[NotificationTriggers]
中。为此,数据必须为userdefaults
和encoded
。我在这里遵循了教程:
https://cocoacasts.com/ud-5-how-to-store-a-custom-object-in-user-defaults-in-swift
在这里:
我有一个decoded
中的一个extension
,我在变量的get和set中做魔术。 userDefaults
NotificationTriggers
看起来像这样:
Struct
struct NotificationTriggers: Equatable,Codable {
var doorName: String
var notificationTrigger: String
}
似乎有用,但是在Encoding
中我得到decoding
的话
无法将类型“ [Any]”的值转换为预期的参数类型“数据”
这是代码:
error
我已尝试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
不知道这里缺少什么。有什么想法吗?
解决方法
您使用以下方法为密钥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
,而是保存了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)")
}