2016-01-28 25 views
0

我覺得如果我做正確的事情,但我在我的數據轉換和檢索年底得到一個錯誤。請參閱下面的代碼:節約使用數組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的元素眼福雨燕數組元素類型

+0

郵報被打印到控制檯崩潰時 – dan

+0

的消息,你必須執行'NSCoding'協議存檔類'NSKeyedArchiver' – dan

+0

上述 –

回答

0

看起來像你的代碼,甚至有一些很怪異的強迫鑄造你的解碼器方法回事做工精細。試試這樣:

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文件:

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) 
    } 
} 
+1

經過一段時間的上述代碼工作後,我設法讓它工作。再次感謝! –

+0

@MattButler歡迎你 –

+0

還有一個問題。我可以使用相同的.plist文件來保存多個數組嗎?我是否使用相同的'NSKeyedArchiver.archiveRootObject(myArray,toFile:filePath)'檢索同一個filePath? –