UserDefaults出现问题将数据转换为数组并返回

问题描述

我想做什么:

我想从我预先保存的UserDefaults中获取一个数组,并将自定义对象附加到该数组。之后,我想再次将其编码为数据类型,然后再次将其设置为UserDefaults Key。

我的问题:

编码部分不符合我的预期。 它说:-[__SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x60000011a540

但是我不知道该如何解决

下面是我用于更多上下文的代码

do {

let decoded  = defaults.object(forKey: "ExArray") as! Data
var exo = try NSKeyedUnarchiver.unarchivetopLevelObjectWithData(decoded) as! [Exerc]
exo.append(datas[indexPath.row])

let enco = try NSKeyedArchiver.archivedData(withRootObject: exo,requiringSecureCoding: false)   <- Here is the error
defaults.set(enco,forKey: "ExArray")

} catch {

print("Error encoding custom object NOSEARCHO")

}

这是Exerc的外观:

struct Exerc: Codable {
    var title: String
    var exID: String
}

解决方法

似乎您没有使用存档器功能,那么为什么不使用编码呢?

do {
    
    let key = "ExArray"
    let decoded = defaults.data(forKey: key)!
    var exo = try JSONDecoder().decode([Exerc].self,from: decoded)
    exo.append(datas[indexPath.row])

    let enco = try JSONEncoder().encode(exo)
    defaults.set(enco,forKey: key)

} catch {
    print("Error encoding/decoding custom object NOSEARCHO",error)
}

这只是原始代码的一个简单的重构MVP,但您甚至可以对此做一点工作,并使其在plist文件中易于阅读!