在Swift 3.1中向UserDefaults添加自己的对象数组时出错

时间:2017-07-12 20:06:04

标签: ios swift nscoding

不幸的是,我无法将自己的类对象列表添加到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")

2 个答案:

答案 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