不幸的是,我无法将自己的类对象列表添加到UserDefaults
。生成以下错误:
NSForwarding:警告:类'ClrLearn.highscoreStructure'的对象0x6080002502c0未实现methodSignatureForSelector: - 提前故障无法识别的选择器 - [ClrLearn.highscoreStructure> replacementObjectForKeyedArchiver:]
该类看起来如下(它已根据堆栈上的各种主题进行了修改,例如一个 - how can store custom objects in NSUserDefaults):
class highscoreStructure {
var name : String = ""
var score : Int = 0
init(name: String, score: Int) {
self.name = name
self.score = score
}
required init(coder decoder: NSCoder) {
self.name = decoder.decodeObject(forKey: "name") as? String ?? ""
self.score = decoder.decodeInteger(forKey: "score")
}
func encode(with coder: NSCoder) {
coder.encode(name, forKey: "name")
coder.encode(score, forKey: "score")
}
}
好吧,感觉我在堆栈规则上犯了错误,所以很抱歉rmaddy - 这是第一次也是最后一次,我推荐。 :)
但回到问题,第一部分是由vadian解决的 - 非常感谢!但仍然我的应用程序的那部分不起作用: 我已经将rootObject(NSKeyedArchiver.archivedData(withRootObject:highscoreStructObjects))设置为我的对象数组(这是一个愚蠢的错误!)但仍然有这样的错误:
[ClrLearn.HighscoreStructure encodeWithCoder:]:无法识别的选择器发送>到实例0x6080002586c0
或
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,>原因:' - [ClrLearn.HighscoreStructure> encodeWithCoder:]:无法识别的>选择器发送到实例> 0x6080002586c0' -
聚苯乙烯。我不确定它应该是我应该出错的地方 - 调试日志对我来说仍然不是很清楚,至少在Visual Studio中不干净。 :)也许我应该粘贴其他东西?
PPS。这行代码如下:
let encodedData = NSKeyedArchiver.archivedData(withRootObject: highscoreStructObjects)
UserDefaults.standard.set(encodedData, forKey: "highscores")
答案 0 :(得分:2)
为了能够实施NSCoding
,必须继承NSObject
。
class HighscoreStructure : NSObject { ...
顺便说一下,类名应该以大写字母开头。
decodeObject(forKey: "name")
永远不能nil
你可以安全地写
self.name = decoder.decodeObject(forKey: "name") as! String
答案 1 :(得分:0)
好的,我希望这次我不会犯任何错误 - rmady在其他"主题"中解决了这个问题,但vadian非常非常接近 - 实施NSCoding I需要继承NSObject,因为他写的也是...... NSCoding!这不是很明显吗?对我来说,它不是......在另一方面,也许他试图告诉我,我应该继承这两个,但我的英语不好得到它。无论如何,我找到了一个答案,所以非常感谢Vadian,Rmaddy和对不起再打破一些SOF规则...这是第一次也是最后一次!哦,当我终于找到答案时有一个线索,而且我是盲目的,我之前错过了它 - encodeWithCoder: unrecognized selector sent to instance