swift - 如何 NSKeyedUnarchiver.unarchiveObject

标签 swift ios12 nskeyedunarchiver

我有一个有效但已弃用的工作代码:

这部分没问题:

 let archived = try? NSKeyedArchiver.archivedData(withRootObject: [defaultRecord] as NSArray, requiringSecureCoding: false)

这是弃用的:

 let records = NSKeyedUnarchiver.unarchiveObject(with: unarchivedObject as Data) as? [Record]

'unarchiveObject(with:)' was deprecated in iOS 12.0: Use +unarchivedObjectOfClass:fromData:error: instead

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

有这方面的工作示例吗?

最佳答案

使用新的 API 来归档数组有点棘手。

如果您不使用 try? 忽略错误,您本可以自己弄清楚 😉

为了能够使用 unarchivedObject(ofClass:from: 解码自定义类的数组,您必须使用 plural 形式 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 归档为数组呢?如果您存档单个对象,您可以保留您的类(class)并编写

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 继承。

关于swift - 如何 NSKeyedUnarchiver.unarchiveObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55982244/

相关文章:

swift - 将 Google map 添加到 Swift 中的 View

swift - 语音转文本 macOS swift playground

ios - 键盘可见时如何重绘自定义集合布局?

ios12 - iOS Xcode 10 如何修复损坏的 "New build system"- build.db : database is locked Possibly there are two concurrent builds

ios - 重新打开后应用程序崩溃

ios - NSKeyedArchiver、NSKeyedUnarchiver 和 TimeInterval 四舍五入超过 7 位小数

ios - 无法在 Swift3 中检索正确保存的 NSKeyArchived 对象

ios - 如何将日期信息传递给 CVCalendar 进行显示?

swift - SWReveal - CoreAnimation 警告 : stiffness/damping must be greater than 0

cocoa - GPUImage 无法在 iOS 12 上编译