代码之家  ›  专栏  ›  技术社区  ›  Charles B.

Swift错误:“NSInvalidArgumentException”,原因:“-[\u SwiftValue encodeWithCoder:]:发送到实例0x6000012ABE0的选择器无法识别”

  •  0
  • Charles B.  · 技术社区  · 7 年前

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

    这是我的代码:

    人民阶级:

    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 回复  |  直到 7 年前
        1
  •  3
  •   JaredH    7 年前

    NSCoding 需要 NSObjectProtocol 。只有类才能符合 NSObjectProtocol 您正在使用结构。 ie:

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

    Soroush Khanlou写了一篇很好的帖子 here