2015-09-12 29 views
1

我试图使用NSCoding协议读取和写入数据到plist。当我尝试编写NSObject的子类[GolfHoles]时,我得到一个异常。我用不同的方法阅读过几篇文章,但都没有帮助。encodeWithCoder:无法识别的选择器发送到实例

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) 

    } 
} 

}

我怎样写和读的阵列?

+2

无法决定是否要关闭投票的欺骗或不提供异常说明。无论哪种方式,它是接近。 –

+0

可能因为没有阅读ios标签wiki而关闭投票:-o ...它说“请按照文章[我的应用程序崩溃。现在什么?](http://www.raywenderlich.com/10209/my-app在发布与应用程序崩溃相关的任何问题之前,Ray Wenderlich已经发表了一篇文章,其中解释了如何正确调试一个iOS应用程序,当你没有一个应用程序时,提出与崩溃相关的问题是毫无意义的。 *正确*回溯和异常消息。“ – Michael

+2

您的'GolfHole'类是否符合'NSCoding'协议?它需要像你的“GolfCourse”类一样实施两种协议方法。 – rmaddy

回答

7

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") 
    } 
} 

enter image description here

相关问题