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

Posted

技术标签:

【中文标题】在 Swift 3.1 中将自己的对象数组添加到 UserDefaults 时出错【英文标题】:Error while adding array of own objects to UserDefaults in Swift 3.1 【发布时间】:2017-07-12 20:06:04 【问题描述】:

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

好的,感觉我对 Stack 规则做错了,很抱歉 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")

【问题讨论】:

【参考方案1】:

为了能够实现NSCoding,类必须继承自NSObject

class HighscoreStructure : NSObject  ...

顺便说一下,类名应该以大写字母开头。

decodeObject(forKey: "name") 永远不可能是nil,你可以放心地写

self.name = decoder.decodeObject(forKey: "name") as! String

【讨论】:

【参考方案2】:

好的,我希望这一次我不会犯任何错误 - 问题已由 rmaddy 在其他“主题”中解决,但 vadian 非常非常接近 - 实现 NSCoding 我需要从 NSObject 继承,因为他写的还来自... NSCoding!这不是很明显吗?对我来说不是......另一方面,也许他试图告诉我我应该继承两者,但我的英语太糟糕了。无论如何,我找到了答案,非常感谢您 Vadian,Rmaddy 并再次为违反某些 SOF 规则感到抱歉……这是第一次也是最后一次!哦,当我终于找到答案时,有一个线程,是的,我是盲目的,我之前错过了它 - encodeWithCoder: unrecognized selector sent to instance

【讨论】:

以上是关于在 Swift 3.1 中将自己的对象数组添加到 UserDefaults 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将对象数组发送到服务器?

如何在 Swift 中将数组添加到我的 JSON 字典

在 Swift 中将项目添加到 Firebase 数组而不首先观察数组

在 Swift 中将实例变量的属性保存到 Struct 的静态变量数组中

为啥我不能在 Swift 中将对象数组返回给 UIStackView? [复制]

如何从 C 中将新的字符串元素附加到 Swift 中的数组