在 Swift 3.1 中将自己的对象数组添加到 UserDefaults 时出错
Error while adding array of own objects to UserDefaults in Swift 3.1
不幸的是,我无法将我自己的 class 个对象的列表添加到 UserDefaults
。生成以下错误:
NSForwarding: warning: object 0x6080002502c0 of class 'ClrLearn.highscoreStructure' does not implement methodSignatureForSelector: -- trouble ahead Unrecognized selector -[ClrLearn.highscoreStructure >replacementObjectForKeyedArchiver:]
class 看起来如下(它已根据堆栈上的各种主题进行了修改,例如那个 - ):
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")
}
}
好吧,感觉我在 Stack 规则上做错了什么,所以对不起 rmaddy - 这是第一次也是最后一次,我保证。 :)
但回到问题上来,第一部分由 vadian 解决了 - 非常感谢!但是我的应用程序的那部分仍然不起作用:
我已经将 rootObject (NSKeyedArchiver.archivedData(withRootObject: highscoreStructObjects)) 设置为我的对象数组(如此愚蠢的错误!)但仍然有这样的错误:
[ClrLearn.HighscoreStructure encodeWithCoder:]: unrecognized selector sent >to instance 0x6080002586c0
或
Terminating app due to uncaught exception 'NSInvalidArgumentException', >reason: '-[ClrLearn.HighscoreStructure >encodeWithCoder:]: unrecognized >selector sent to instance >0x6080002586c0' –
Ps。我不确定这是不是我应该出错的地方 - 调试日志对我来说仍然不清楚,至少不像 Visual Studio 中的那样干净。 :) 也许我应该贴点别的?
Pps。这行代码看起来像:
let encodedData = NSKeyedArchiver.archivedData(withRootObject: highscoreStructObjects)
UserDefaults.standard.set(encodedData, forKey: "highscores")
为了能够实现 NSCoding
class 必须 继承自 NSObject
。
class HighscoreStructure : NSObject { ...
顺便说一下,class 名称应该以大写字母开头。
而且decodeObject(forKey: "name")
永远不会nil
你可以安全地写
self.name = decoder.decodeObject(forKey: "name") as! String
好的,我希望这次我不会犯任何错误 - 问题已由 rmaddy 在其他 "topic" 中解决,但 vadian 非常非常接近 - 要实现 NSCoding 我需要继承他写的来自 NSObject,但也来自... NSCoding!这不是很明显吗?对我来说不是……另一方面,也许他试图告诉我我应该继承两者,但我的英语太差了。无论如何,我找到了答案,非常感谢 Vadian、Rmaddy,再次抱歉打破了某些 SOF 规则……这是第一次也是最后一次!哦,当我终于找到答案时有一个线程,是的,我是盲目的,我之前错过了它 - encodeWithCoder: unrecognized selector sent to instance
不幸的是,我无法将我自己的 class 个对象的列表添加到 UserDefaults
。生成以下错误:
NSForwarding: warning: object 0x6080002502c0 of class 'ClrLearn.highscoreStructure' does not implement methodSignatureForSelector: -- trouble ahead Unrecognized selector -[ClrLearn.highscoreStructure >replacementObjectForKeyedArchiver:]
class 看起来如下(它已根据堆栈上的各种主题进行了修改,例如那个 -
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")
}
}
好吧,感觉我在 Stack 规则上做错了什么,所以对不起 rmaddy - 这是第一次也是最后一次,我保证。 :)
但回到问题上来,第一部分由 vadian 解决了 - 非常感谢!但是我的应用程序的那部分仍然不起作用: 我已经将 rootObject (NSKeyedArchiver.archivedData(withRootObject: highscoreStructObjects)) 设置为我的对象数组(如此愚蠢的错误!)但仍然有这样的错误:
[ClrLearn.HighscoreStructure encodeWithCoder:]: unrecognized selector sent >to instance 0x6080002586c0
或
Terminating app due to uncaught exception 'NSInvalidArgumentException', >reason: '-[ClrLearn.HighscoreStructure >encodeWithCoder:]: unrecognized >selector sent to instance >0x6080002586c0' –
Ps。我不确定这是不是我应该出错的地方 - 调试日志对我来说仍然不清楚,至少不像 Visual Studio 中的那样干净。 :) 也许我应该贴点别的?
Pps。这行代码看起来像:
let encodedData = NSKeyedArchiver.archivedData(withRootObject: highscoreStructObjects)
UserDefaults.standard.set(encodedData, forKey: "highscores")
为了能够实现 NSCoding
class 必须 继承自 NSObject
。
class HighscoreStructure : NSObject { ...
顺便说一下,class 名称应该以大写字母开头。
而且decodeObject(forKey: "name")
永远不会nil
你可以安全地写
self.name = decoder.decodeObject(forKey: "name") as! String
好的,我希望这次我不会犯任何错误 - 问题已由 rmaddy 在其他 "topic" 中解决,但 vadian 非常非常接近 - 要实现 NSCoding 我需要继承他写的来自 NSObject,但也来自... NSCoding!这不是很明显吗?对我来说不是……另一方面,也许他试图告诉我我应该继承两者,但我的英语太差了。无论如何,我找到了答案,非常感谢 Vadian、Rmaddy,再次抱歉打破了某些 SOF 规则……这是第一次也是最后一次!哦,当我终于找到答案时有一个线程,是的,我是盲目的,我之前错过了它 - encodeWithCoder: unrecognized selector sent to instance