首页 > 解决方案 > 如何 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: 代替

听起来很简单,但我找不到一种方法来使用建议的方法,而不会在我尝试的每个组合中出错。

这有什么可行的例子吗?

标签: swiftios12nskeyedunarchiver

解决方案


使用新 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.


推荐阅读