Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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
Swift UserDefaults问题(将数据转换为数组并返回)_Swift_Nsuserdefaults_Unrecognized Selector_Nskeyedarchiver - Fatal编程技术网

Swift 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

我想做什么:

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

我的问题:

编码部分不适合我。 它说:
-[\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)
}