Saving array using NSUserDefaults crashes app

倖福魔咒の 提交于 2019-12-01 14:40:27

Looks like your code should work fine even with some really weird forced casting going on in your decoder method. Try like this:

class Task: NSObject, NSCoding {
    var name = String()
    var notes = String()
    var date: NSDate
    var taskCompleted: Bool
    init(name: String, notes: String, date: NSDate, taskCompleted: Bool){
        self.name = name
        self.notes = notes
        self.date = date
        self.taskCompleted = taskCompleted
    }
    required init(coder decoder: NSCoder){
        self.name = decoder.decodeObjectForKey("name") as! String
        self.notes = decoder.decodeObjectForKey("notes") as! String
        self.date = decoder.decodeObjectForKey("date") as! NSDate
        self.taskCompleted = decoder.decodeBoolForKey("taskCompleted")
    }
    func encodeWithCoder(coder: NSCoder) {
        coder.encodeObject(name, forKey: "name")
        coder.encodeObject(notes, forKey: "notes")
        coder.encodeObject(date, forKey: "date")
        coder.encodeBool(taskCompleted, forKey: "taskCompleted")
    }
}

Testing with plist files:

let task1 = Task(name: "task1", notes: "note a", date: NSDate(), taskCompleted: false)
let task2 = Task(name: "task2", notes: "note b", date: NSDate(), taskCompleted: true)

let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!
let fileURL = documentsDirectory.URLByAppendingPathComponent("data.plist")

if let filePath = fileURL.path {
    NSKeyedArchiver.archiveRootObject([task1,task2], toFile: filePath)
    if let loadedArray = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? [Task] {
        print(loadedArray.count)

        print(loadedArray.first?.name ?? "")
        print(loadedArray.first?.notes ?? "")
        print(loadedArray.first!.date )
        print(loadedArray.first!.taskCompleted)

        print(loadedArray.last?.name ?? "")
        print(loadedArray.last?.notes ?? "")
        print(loadedArray.last!.date )
        print(loadedArray.last!.taskCompleted)
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!