NSKeyedUnarchiver 不适用于 Swift 3

Posted

技术标签:

【中文标题】NSKeyedUnarchiver 不适用于 Swift 3【英文标题】:NSKeyedUnarchiver not working with Swift 3 【发布时间】:2017-01-24 01:03:30 【问题描述】:

我有以下代码用于在我的 Mac 应用程序中解压缩文件:

func tryOpen(_ filePath: String) throws -> NSArray 
    if #available(OSX 10.11, *) 
        do 
            if let data = try? Data(contentsOf: URL(fileURLWithPath: filePath)) 
                let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as! NSArray
                return array
             else 
                throw NSError(domain: NSExceptionName.invalidUnarchiveOperationException.rawValue, code: 0, userInfo: nil)
            
         catch let ex 
            throw ex
        
     else 
        // Fallback on earlier versions
        let dat = try? Data(contentsOf: URL(fileURLWithPath: filePath))
        let unarchiver = NSKeyedUnarchiver(forReadingWith: dat!)
        if let array = unarchiver.decodeObject(forKey: "root") as? NSArray 
            return array
         else 
            throw NSException(name: NSExceptionName.invalidArgumentException, reason: "Unable to unarchive file", userInfo: nil) as! Error
        
    

但是,自从我在 Xcode 8.0 中升级到 Swift 3 后,我收到了以下错误消息: 'unarchiveTopLevelObjectWithData' is unavailable in Swift: Use 'unarchiveTopLevelObjectWithData(_:) throws' instead,这几乎是一回事,对吧?所以我对如何解决这个问题感到非常困惑。这是 Xcode 中的错误吗?

【问题讨论】:

期待NSData: try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data as NSData)。看起来有些东西刚刚从 API 的裂缝中溜走了。 不相关,但您可以稍微简化一下:gist.github.com/robertmryan/73c19aaed3792723ba3e8c28960d94e2 @Rob,这应该是一个答案而不是评论:) 【参考方案1】:

NSKeyedUnarchiver 仍然期待 NSData

let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data as NSData) as! NSArray

这已在 Swift 4 中得到解决

【讨论】:

在 Swift 4 中修复!

以上是关于NSKeyedUnarchiver 不适用于 Swift 3的主要内容,如果未能解决你的问题,请参考以下文章

错误处理 - NSKeyedUnarchiver

捕获 NSKeyedUnarchiver 异常

NSKeyedUnarchiver.unarchiveObject 不工作 [重复]

NSKeyedUnarchiver.unarchiveObject() 取消归档旧对象

NSKeyedUnarchiver - 删除解码的数据?

NSKeyedUnarchiver - 需要尝试/捕获?