Swift 如何归解档自定义对象的数组?

90 阅读1分钟

我有很多个自定义对象,把它们放到数组中,然后想归档这个数组,怎么做?

  1. 自定义对象要遵循 NSSecureCoding 协议并继承 NSObject
  2. 实现编解码方法
    class SweetModel: NSObject, NSSecureCoding {
     
     var name: String?
     var hashMD5: String?
     
     static var supportsSecureCoding: Bool {
         return true
     }
     func encode(with coder: NSCoder) {
         coder.encode(name, forKey: "name")
         coder.encode(hash, forKey: "hashMd5")
     }
     
     required init?(coder: NSCoder) {
         name = coder.decodeObject(of: [NSString.self], forKey: "name") as? String
         hashMD5 = coder.decodeObject(of: [NSString.self], forKey: "hashMd5") as? String
     }
     
     required override init() { }
     }
    
  3. 愉快地归档和解档
    do {
         let data = try NSKeyedArchiver.archivedData(withRootObject: SweetModelArray, requiringSecureCoding: true)
         try data.write(to: filePath)
    
     } catch {
         print("持久化失败,error: \(error.localizedDescription)")
     }
     
     解档
     let classTypes = [NSArray.self, SweetModel.self]
     do {
         let data = try Data(contentsOf: filePath)
         if let unarchivedModels = try NSKeyedUnarchiver.unarchivedObject(ofClasses: classTypes, from: data) as? [SucceedDownloadModel] {
             self.SweetModelArray.append(unarchivedModels)
         }
     } catch {
     }
    

这里我在归档的时候 requiringSecureCoding 指定为 true,表示在归档时启用「安全编码」,要求被编码的对象所属的类要遵循 NSSecureCoding。 如果不需要安全编码,那么类遵循 NSCoding,实现编解码方法即可(不需要实现 supportsSecureCoding 属性),这时 requiringSecureCoding 指定为 false

参考资料

iOS12归档、解档对象、数组、字典 - 知乎 (zhihu.com)