NSKeyedArchiver.unarchiveObject Swift 3 iOS 10

Sma*_*bas 3 nskeyedunarchiver swift3 ios10

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

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 []
    }

}
Run Code Online (Sandbox Code Playgroud)

这是节约:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

但最终我总是得到"致命的错误:在解开一个Optional值时意外地发现了nil"

Sma*_*bas 6

我在找错了地方.实际上保存和加载过程很好,问题是符合NSCoding协议所需的init:我正在使用

aDecoder.decodeObject(forKey:xxx) as! Bool
Run Code Online (Sandbox Code Playgroud)

而不是新的

aDecoder.decodeBool(forKey:xxx)
Run Code Online (Sandbox Code Playgroud)

通过使用错误命令的快速2.3-> 3转换器自动更改它的事实,请注意这一点!

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