ios - 如何解码对象数组并从用户默认值中检索它?

标签 ios swift encoding decoding userdefaults

我有一个类型为 [NotificationTriggers]array,我想将其存储在 userdefaults 中。为此,需要对数据进行编码解码。我在这里遵循了教程:

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

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

我有一个 userDefaults扩展,我可以在其中实现变量的获取和设置。 NotificationTriggers Struct 看起来像这样:

struct NotificationTriggers: Equatable, Codable {
    var doorName: String
    var notificationTrigger: String
}

编码似乎有效,但在解码中我收到一个错误

Cannot convert value of type '[Any]' to expected argument type '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 { }
        }
    }
}

我尝试转换数据:

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'"

不确定这里缺少什么。有什么想法吗?

最佳答案

您可以通过以下方式保存键UserDefaultsKey.notificationTrigger.rawValueData:

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) {

数组(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)")
}

关于ios - 如何解码对象数组并从用户默认值中检索它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64168809/

相关文章:

ios - Swift - 命令因信号 : Segmentation Fault 11 而失败

ios - 属性文本不更改字体

ios - 尝试从应用内发送电子邮件但不起作用 - Swift (iOS)

ios - Swift-获取自计时器启动以来经过了多少秒/毫秒

Java escpos 字符集编码

ios - 去除 64 位 SDK 的警告

ios - 使用 Swift 实现应用内电子邮件失败

go - 递归数据结构解码在 Go Lang Protobuf 中给出错误 "cannot parse invalid wire-format data"

python - 写入 CSV 时编码 UTF-8

ios - 我需要知道蓝牙是否打开/关闭,无论设备如何