encodeWithCoder:无法识别的select器发送到实例

我试图使用NSCoding协议读取和写入数据plist。 当我尝试编写NSObject的子类[GolfHoles]时,我得到一个exception。 我已经阅读了几个不同的方法,但没有任何帮助。

class GolfCourse: NSObject, NSCoding { var name: String = "" var location: String = "" var holes: [GolfHole] = [GolfHole]() init(holes: [GolfHole]) { self.holes = holes } // MARK: NSCoding Protocol func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(name, forKey: "name") aCoder.encodeObject(location, forKey: "location") aCoder.encodeObject(holes, forKey: "holes") // exception here } required init(coder aDecoder: NSCoder) { super.init() name = aDecoder.decodeObjectForKey("name") as! String location = aDecoder.decodeObjectForKey("location") as! String holes = aDecoder.decodeObjectForKey("holes") as! [GolfHole] } override init() { super.init() for var i=0; i<18; i++ { let newHole = GolfHole() self.holes.append(newHole) } } 

}

我如何编写和读取数组?

rmaddy是对的。 你需要让所有将被保存的类都符合NSCoding。 所以这里是一个GolfHole类的简单例子,以及如何序列化GolfCourse对象。

 class GolfHole: NSObject, NSCoding { let number: Int let par: Int init(number: Int, par: Int) { self.number = number self.par = par } convenience required init?(coder aDecoder: NSCoder) { guard let number = aDecoder.decodeObjectForKey("number") as? Int, let par = aDecoder.decodeObjectForKey("par") as? Int else { return nil } self.init(number: number, par: par) } func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(number, forKey: "number") aCoder.encodeObject(par, forKey: "par") } } class GolfCourse: NSObject, NSCoding { var name = "" var location = "" var holes = [GolfHole]() init(name: String, location: String, holes: [GolfHole]) { self.name = name self.location = location self.holes = holes } convenience required init?(coder aDecoder: NSCoder) { guard let name = aDecoder.decodeObjectForKey("name") as? String, let location = aDecoder.decodeObjectForKey("location") as? String, let holes = aDecoder.decodeObjectForKey("holes") as? [GolfHole] else { return nil } self.init(name: name, location: location, holes: holes) } func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(name, forKey: "name") aCoder.encodeObject(location, forKey: "location") aCoder.encodeObject(holes, forKey: "holes") } } 

在这里输入图像说明