Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何解码对象数组并从userdefaults检索它?_Ios_Swift_Encoding_Decoding_Userdefaults - Fatal编程技术网

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

Ios 如何解码对象数组并从userdefaults检索它?,ios,swift,encoding,decoding,userdefaults,Ios,Swift,Encoding,Decoding,Userdefaults,我有一个类型为[NotificationTriggers]的数组,我想将其存储在userdefaults中。为此,需要对数据进行编码和解码。我在这里学习了一些教程: 在这里: 但我仍然遇到一个我似乎无法解决的错误 我有一个的扩展的userDefaults,在这里我在变量的get和set中发挥了神奇的作用通知触发器结构如下所示: struct NotificationTriggers: Equatable, Codable { var doorName: String var

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

在这里:

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

我有一个
扩展
userDefaults
,在这里我在变量的get和set中发挥了神奇的作用<代码>通知触发器
结构
如下所示:

struct NotificationTriggers: Equatable, Codable {
    var doorName: String
    var notificationTrigger: String
}
编码
似乎有效,但在
解码
中,我收到一个
错误

无法将“[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'"

不知道这里少了什么。有什么想法吗?

您可以为键
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) {
数组(forKey:)
?不,
数据(forKey:)
,您没有保存一个
数组
,您保存了一个
数据
,一个
数据
,在解码后可能会“隐藏”一个
数组
,但系统不知道它。 因此,它应该是:

if let data = self.data(forKey: UserDefaultsKey.notificationTrigger.rawValue) {
然后:

=>

另外,有
捕获{}
是一个坏习惯,如果有错误,您可能想知道:

catch {
    print("Error while doingSomethingToCustomizeHere: \(error)")
}

self.array(forKey:
=>
self.data(forKey:
[NotificationTriggers]?.self
=>
=>
应该起作用。另外,在
catch
中,不要什么都不做,而是:
catch{print(“在定制时出错:\(Error)”)
啊,很好,我今天学到了一些东西:)非常感谢你在@Larme上澄清了这一点
let decodedData = try decoder.decode([NotificationTriggers].self, from: data)
catch {
    print("Error while doingSomethingToCustomizeHere: \(error)")
}