UserDefaults 问题(将数据转换为数组并返回)
Issue with UserDefaults (converting data to array and back)
我想做的事情:
我想从我事先保存的 UserDefaults 中获取一个数组,并向其附加一个自定义对象。之后我想再次将其编码为数据类型并再次将其设置为 UserDefaults 键。
我的问题:
编码部分无法正常工作。
它说:-[__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
文件中使其易于阅读!
我想做的事情:
我想从我事先保存的 UserDefaults 中获取一个数组,并向其附加一个自定义对象。之后我想再次将其编码为数据类型并再次将其设置为 UserDefaults 键。
我的问题:
编码部分无法正常工作。
它说:-[__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
文件中使其易于阅读!