swift - 如何 NSKeyedUnarchiver.unarchiveObject
问题描述
我有一个有效但已弃用的工作代码:
这部分很好:
let archived = try? NSKeyedArchiver.archivedData(withRootObject: [defaultRecord] as NSArray, requiringSecureCoding: false)
这已弃用:
let records = NSKeyedUnarchiver.unarchiveObject(with: unarchivedObject as Data) as? [Record]
'unarchiveObject(with:)' 在 iOS 12.0 中已弃用:使用 +unarchivedObjectOfClass:fromData:error: 代替
听起来很简单,但我找不到一种方法来使用建议的方法,而不会在我尝试的每个组合中出错。
这有什么可行的例子吗?
解决方案
使用新 API 归档数组有点棘手。
如果您不忽略以下错误,您本可以自己弄清楚try?
为了能够解码自定义类的数组,unarchivedObject(ofClass:from:
您必须使用复数形式unarchivedObject(ofClasses:from:
并指定NSArray
(!) 和自定义类。此外,您的班级必须采用NSSecureCoding
class Record : NSObject, NSSecureCoding {
static var supportsSecureCoding: Bool {
return true
}
....
do {
let archived = try NSKeyedArchiver.archivedData(withRootObject: [defaultRecord], requiringSecureCoding: false)
let records = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSArray.self, Record.self], from: archived) as! [Record]
print(records)
} catch { print(error) }
但是你为什么要归档defaultRecord
为数组呢?如果你归档单个对象,你可以让你的班级保持原样并写
do {
let archived = try NSKeyedArchiver.archivedData(withRootObject: defaultRecord, requiringSecureCoding: false)
let record = try NSKeyedUnarchiver.unarchivedObject(ofClass: Record.self, from: archived)
let records = [record]
print(records)
} catch { print(error) }
旁注:考虑用Codable
. 它更快捷,不需要继承自NSObject
.
推荐阅读
- javascript - 如何将用户代理存储在数据库中?
- javascript - Ajax Call 移除 UI 元素
- antlr4 - 如何根据ANTLR4中的关键字跳过输入
- python - 使用 Python Scrapy 无法抓取 BBC
- javascript - 将 .mp3 转换为 .ogg 作品/电报机器人/节点 js
- git - 如何将 10GB 的文件推送到 git?
- google-apps-script - 将日期从 d"-"mmm"-"yy 格式化为 "YYYY-MM-DD" 输出无效年份
- node.js - 部署 ReactJs + MySQL + NodeJs Express 项目
- python - pytest:在测试用例不可见的夹具中分配属性
- sql - SQL : 获取对应数据的 SQL 查询