Swift 4中NSKeyedUnarchiver.unarchiveTopLevelObjectWithData废弃替代方案咨询
解决Swift 4中NSKeyedUnarchiver.unarchiveTopLevelObjectWithData过时的问题
嗨,我刚好碰到过这个问题!在Swift 4里unarchiveTopLevelObjectWithData(_:)确实被标记为过时了,Xcode的提示没直接给出替代API确实有点坑,但苹果其实提供了更贴合Swift原生风格的替代方法——unarchiveTopLevelObject(with:)。
直接修改你的现有代码
你原来的代码可以改成下面这样,直接替换过时方法并调整参数类型:
if let data = NSData(contentsOfFile: path) as Data? { do { possibleObject = try NSKeyedUnarchiver.unarchiveTopLevelObject(with: data) as? CacheObject } catch { // 建议不要留空catch,添加错误处理便于调试 print("解档CacheObject失败:\(error.localizedDescription)") } }
更贴合Swift风格的写法
另外,推荐你用Swift原生的Data类型替代NSData,代码会更简洁统一:
do { // 先把文件路径转成URL,用Swift原生API读取文件数据 let fileURL = URL(fileURLWithPath: path) let data = try Data(contentsOf: fileURL) // 调用新的解档方法 possibleObject = try NSKeyedUnarchiver.unarchiveTopLevelObject(with: data) as? CacheObject } catch { print("读取文件或解档失败:\(error.localizedDescription)") }
补充说明
这个unarchiveTopLevelObject(with:)方法和你原来用的过时方法功能完全一致,只是参数从NSData换成了Swift原生的Data类型(得益于Swift和Objective-C的桥接,你也可以直接把NSData实例转成Data使用)。当时Xcode的提示没明确标注替代方法可能是因为文档更新滞后,但这是官方指定的后续版本替换方案,完全适配Swift 4环境。
内容的提问来源于stack exchange,提问作者brandonscript
相关产品推荐
相关产品推荐

