【问题标题】:Swift error: 'NSInvalidArgumentException', reason: '-[_SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x60000012abe0'Swift 错误:'NSInvalidArgumentException',原因:'-[_SwiftValue encodeWithCoder:]:无法识别的选择器发送到实例 0x60000012abe0'
【发布时间】:2018-03-25 23:16:49
【问题描述】:

我有这个错误。我知道有些人已经在其他线程上回答了这个问题,但给出的答案似乎对我不起作用。

这是我的代码:

人物类:

class People: NSObject, NSCoding {

    var firstName : String
    var lastName : String
    var events : [Event]
    init(firstName: String, lastName: String) {

        self.firstName = firstName
        self.lastName = lastName
        self.events = []
    }

    required init (coder aDecoder: NSCoder) {
         firstName = aDecoder.decodeObject(forKey: "firstName") as! String
        lastName = aDecoder.decodeObject(forKey: "lastName") as! String
        events = aDecoder.decodeObject (forKey: "events") as! [Event]


    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(firstName, forKey: "firstName")
        aCoder.encode(lastName, forKey: "lastName")        
        aCoder.encode(events, forKey: "events")
    }

}

这里是我调用保存文件的地方:

func SaveMyPeople(){
    let Defaults = UserDefaults.standard
    let SavedData = NSKeyedArchiver.archivedData(withRootObject: ArrayPeople)
    Defaults.set(SavedData, forKey: "People") 
}

这是事件结构:

struct Event{
    var date : String
    var message : String
}

如果我能得到任何帮助,我们将不胜感激

【问题讨论】:

  • 这不是问题,但您在required init?(coder aDecoder: NSCoder) 中缺少super.init(coder: aDecoder),并且在init 的签名中也缺少?

标签: swift nsuserdefaults nscoding


【解决方案1】:

NSCoding 需要NSObjectProtocol。只有类可以符合NSObjectProtocol 并且您使用的是结构。 即:

struct Event{
    var date : String
    var message : String
}

Soroush Khanlou 写了一篇关于这个 here 的好帖子

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 2015-08-02
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多