Swift UserDefaults问题(将数据转换为数组并返回)
我想做什么: 我想从事先保存的UserDefaults中获取一个数组,并向其附加一个自定义对象。之后,我想再次将其编码为数据类型,并再次将其设置为UserDefaults键 我的问题: 编码部分不适合我。 它说:Swift UserDefaults问题(将数据转换为数组并返回),swift,nsuserdefaults,unrecognized-selector,nskeyedarchiver,Swift,Nsuserdefaults,Unrecognized Selector,Nskeyedarchiver,我想做什么: 我想从事先保存的UserDefaults中获取一个数组,并向其附加一个自定义对象。之后,我想再次将其编码为数据类型,并再次将其设置为UserDefaults键 我的问题: 编码部分不适合我。 它说:-[\uu SwiftValue ENCODER:]:未识别的选择器发送到实例0x6000001A540 但我不知道如何解决这个问题 以下是我的代码以了解更多上下文: do { let decoded = defaults.object(forKey: "ExArray&q
-[\uu SwiftValue ENCODER:]:未识别的选择器发送到实例0x6000001A540
但我不知道如何解决这个问题
以下是我的代码以了解更多上下文:
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")
}
似乎您没有使用archiver特性,那么为什么不直接使用codable呢
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
文件中对其进行一些处理,使其具有可读性 另外,我建议您使用Codable
在两个方向上转换数组/数据。从错误的声音可以看出,您只需要在Exerc
类上实现NSCoding
协议:。如果您想使用更现代的API,我支持Codable
选项。@Kubee现在添加了struct:Codable{…}
,但它不起作用。Codable使用JSONEncoder/JSONDecoder。您将不得不使用这些类对数据进行编码和解码,并放弃NSKeyedUnachiver/NSKeyedArchivery在不知道Exerc是什么的情况下无法回复。同时,我自己解决了它,它看起来像您的答案。要等23小时才能给你赏金。但无论如何,谢谢你。
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)
}