Swift错误:' NSInvalidArgumentException',原因:' - [_ SwiftValue encodeWithCoder:]:无法识别的选择器发送到实例0x60000012abe0'

时间:2018-03-25 23:16:49

标签: swift nsuserdefaults nscoding

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

这是我的代码:

人民班:

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
}

非常感谢我能得到的任何帮助

1 个答案:

答案 0 :(得分:3)

NSCoding需要NSObjectProtocol。只有类可以符合NSObjectProtocol并且您正在使用Struct。 即:

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

Soroush Khanlou写了一篇关于这个here

的好文章