如何解码对象数组并从userdefaults中检索它?

问题描述

我有一个类型为array的{​​{1}},我想存储在[NotificationTriggers]中。为此,数据必须为userdefaultsencoded。我在这里遵循了教程:

https://cocoacasts.com/ud-5-how-to-store-a-custom-object-in-user-defaults-in-swift

在这里

https://www.hackingwithswift.com/example-code/system/how-to-load-and-save-a-struct-in-userdefaults-using-codable

但是我仍然遇到我似乎无法解决错误

我有一个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)")
}