【发布时间】:2020-09-01 23:18:33
【问题描述】:
我想做的事:
我想从预先保存的 UserDefaults 中获取一个数组,并将一个自定义对象附加到它上面。之后我想再次将其编码为 Data-type 并再次将其设置为 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
}
【问题讨论】:
-
作为替代方案,我建议您使用
Codable来双向转换您的数组/数据。见Save Struct to UserDefaults -
根据错误的声音,您只需要在您的
Exerc类上实现NSCoding协议:raywenderlich.com/…。如果您想使用更现代的 API,我支持Codable选项。 -
@Kubee 现在添加了
struct: Codable {...},但它不起作用。 -
Codable 使用 JSONEncoder/JSONDecoder。您将不得不使用这些类对数据进行编码和解码,并废弃 NSKeyedUnarchiver/NSKeyedArchiver
-
在不知道练习是什么的情况下无法回复。
标签: swift nsuserdefaults unrecognized-selector nskeyedarchiver