Swift 3 Xcode 8 - SwiftValue encodeWithCoder - 发送到实例的无法识别的选择器

Posted

技术标签:

【中文标题】Swift 3 Xcode 8 - SwiftValue encodeWithCoder - 发送到实例的无法识别的选择器【英文标题】:Swift 3 Xcode 8 - SwiftValue encodeWithCoder - unrecognized selector sent to instance 【发布时间】:2016-10-26 15:17:02 【问题描述】:

我的自定义对象使用以下方法符合 NSCoding 协议

required init(coder decoder: NSCoder) 
    super.init()

    createdDate = decoder.decodeObject(forKey: "created_date") as? Date
    userId = decoder.decodeInteger(forKey: "user_id")


func encode(with aCoder: NSCoder) 
    aCoder.encode(createdDate, forKey: "created_date")
    aCoder.encode(userId, forKey: "user_id")

这是 Swift 3 中 nscoding 协议的正确方法名称,但是应用程序崩溃并出现错误 SwiftValue encodeWithCoder - unrecognized selector sent to instance

明明这个方法不可用,为什么不识别呢?

参考https://developer.apple.com/reference/foundation/nscoding

这是我做的归档方法

func encodeObject(_ defaults:UserDefaults, object:NSCoding?, key:String) 
    if (object != nil) 
        let encodedObject = NSKeyedArchiver.archivedData(withRootObject: object)
        defaults.set(encodedObject, forKey: key)
     else 
        defaults.removeObject(forKey: key)
    

【问题讨论】:

就我而言,我正在将应用程序从 swift 2 迁移到 4,并且编码/解码没有很好地实现。所以我就跟着***.com/a/37983027/5561910 【参考方案1】:

问题是您正在尝试归档可选内容。替换这一行:

if (object != nil) 

与:

if let object = object 

【讨论】:

哇,谢谢你的澄清。这似乎已经解决了它。我想 nil 比较会起作用,但我必须将其标记为非可选。 如果在我的情况下让 self.eventDataArr.count = self.eventDataArr.count 对象是一个数组,我会遇到错误变量绑定条件需要初始化器 if self.eventDataArr.count > 0 这个条件对我有用,谢谢

以上是关于Swift 3 Xcode 8 - SwiftValue encodeWithCoder - 发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 3 xcode 8 中出现错误

SDWebImage 库在 swift 3 Xcode 8.0 中出现错误

Swift 3、Xcode 8 中的 UINavigationController

Xcode 8 / Swift 3 - 类型“CGColorRenderingIntent”没有成员“RenderingIntentDefault”

Xcode 8.3 不支持 Swift 2.3 [关闭]

Xcode 8 - Swift 3 - 破坏我的应用程序