我有很多个自定义对象,把它们放到数组中,然后想归档这个数组,怎么做?
- 自定义对象要遵循 NSSecureCoding 协议并继承 NSObject
- 实现编解码方法
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() { } }
- 愉快地归档和解档
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