You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:24:36