使用NSUserDefaults保存数组会崩溃应用程序

我感觉好像我正在做的事情,但我的数据转换和检索结束时出现错误。 请参阅下面的代码:

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.decodeObjectForKey("taskCompleted") as! Bool?)! } func encodeWithCoder(coder: NSCoder) { coder.encodeObject(self.name, forKey: "name") coder.encodeObject(self.notes, forKey: "notes") coder.encodeObject(self.date, forKey: "date") coder.encodeObject(self.taskCompleted, forKey: "taskCompleted") } } 

然后我保存并获取数据如下:

 let nowData = NSKeyedArchiver.archivedDataWithRootObject([nowTasks]) let defaults = NSUserDefaults.standardUserDefaults() defaults.setObject(nowData, forKey: "nowData") let loadedData = defaults.dataForKey("nowData") let loadedArray = NSKeyedUnarchiver.unarchiveObjectWithData(loadedData!) as! [Task] 

当我print(loadedArray.first)我得到的错误: NSArray元素无法匹配的Swift数组元素types

看起来像你的代码应该工作正常,即使在你的解码器方法进行一些非常奇怪的强制铸造。 尝试像这样:

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

用plist文件testing:

 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) } } 
Interesting Posts