【问题标题】:Issue with UserDefaults (converting data to array and back)UserDefaults 问题(将数据转换为数组并返回)
【发布时间】: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


【解决方案1】:

好像你没有使用归档功能,那你为什么不直接使用可编码的?

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 文件中可读!

【讨论】:

  • 同时自己解决了它,看起来像你的答案。必须等待 23 小时才能给你赏金。但无论如何,谢谢。
猜你喜欢
  • 2019-10-20
  • 2020-09-04
  • 2012-02-24
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多