NSKeyedArchiver.unarchiveObject Swift 3 iOS 10

问题描述:

我一直在寻找这个问题的答案,但我找不到任何,类似的人根本没有答案。 基本上,我想用NSKeyedUnarchiver.archiveRootObject()保存数据并使用.unarchiveObject(withFile)加载它。它在Swift 2.3中工作正常,现在它崩溃了,说明unarchive部分总是回零。我也检查该文件是否存在,它是否存在。我真的不知道发生了什么事。 这是装载程序:NSKeyedArchiver.unarchiveObject Swift 3 iOS 10

func loadnotifs(_ username:String)->[AFNotificationData]{ 
    let ArchiveURL = Constants.DocumentsDirectory.appendingPathComponent(username) 
     print("loading " + ArchiveURL.path) 
    if FileManager.default.fileExists(atPath: ArchiveURL.path) { 
     let unarchived = NSKeyedUnarchiver.unarchiveObject(withFile: ArchiveURL.path) as? [AFNotificationData] 
     if unarchived != nil { 
      return NSKeyedUnarchiver.unarchiveObject(withFile: ArchiveURL.path) as! [AFNotificationData] 
     } else { 
      return [] 
     } 
    } 
    else { 
     return [] 
    } 

} 

,这是节约:

func savenotifs(_ username:String){ 
    if username != "" { 
     let ArchiveURL = Constants.DocumentsDirectory.appendingPathComponent(username) 
     print("saving " + ArchiveURL.path) 
     } 

     let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(AFDatabase.sharedDatabase.notificationList, toFile: ArchiveURL.path) 
     if !isSuccessfulSave { 
      print("Failed to save notifs") 
     } 

    } 
} 

但最终我总是得到“致命错误:意外发现零而展开的可选值”

我在找错地方。其实保存和加载程序都很好,问题是所需的init需要遵守NSCoding协议: 我用

aDecoder.decodeObject(forKey:xxx) as! Bool 

而不是新的

aDecoder.decodeBool(forKey:xxx) 

给予的事实,这是由使用错误命令的快速2.3-> 3转换器自动更改,请小心!

此外,请注意,因为此命令与swift 2.3中的布尔值/整数不兼容。