NSKeyedArchiver.unarchiveObject Swift 3 iOS 10

Posted

技术标签:

【中文标题】NSKeyedArchiver.unarchiveObject Swift 3 iOS 10【英文标题】: 【发布时间】:2017-02-11 07:28:52 【问题描述】:

我一直在寻找这个问题的答案,但我找不到任何答案,类似的根本没有答案。 基本上,我想用 NSKeyedUnarchiver.archiveRootObject() 保存数据并用 .unarchiveObject(withFile) 加载它。它在 Swift 2.3 上运行良好,现在它崩溃了,说非归档部分总是返回 nil。我还检查该文件是否存在并且确实存在。我真的不知道发生了什么事。 这是加载过程:

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

    

但最后我总是得到“致命错误:在展开可选值时意外发现 nil”

【问题讨论】:

【参考方案1】:

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

aDecoder.decodeObject(forKey:xxx) as! Bool

而不是新的

aDecoder.decodeBool(forKey:xxx)

考虑到它是由 swift 2.3->3 转换器使用错误的命令自动更改的,请注意这一点!

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

【讨论】:

以上是关于NSKeyedArchiver.unarchiveObject Swift 3 iOS 10的主要内容,如果未能解决你的问题,请参考以下文章