【问题标题】:How do I decode an object array and retrieve it from userdefaults?如何解码对象数组并从 userdefaults 中检索它?
【发布时间】:2021-01-17 23:15:34
【问题描述】:

我有一个array 类型为[NotificationTriggers],我想将它存储在userdefaults 中。为此,数据需要为encodeddecoded。我在这里学习了教程:

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

但我仍然收到一个似乎无法解决的错误。

我有一个 extensionuserDefaults,我在变量的 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


【解决方案1】:

您将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)")
}

【讨论】:

  • 啊,太好了,我今天学到了一些东西 :) 非常感谢你清理这个@Larme
猜你喜欢
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 2018-12-28
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
相关资源
最近更新 更多