class TestModel: NSObject, NSCoding, NSSecureCoding {
static var supportsSecureCoding: Bool { return true }
var name: String
required init(name: String) {
self.name = name
}
required init(coder decoder: NSCoder) {
self.name = decoder.decodeObject(forKey: "name") as? String ?? ""
}
func encode(with coder: NSCoder) {
coder.encode(name, forKey: "name")
}
func saveModelToFile(mo: TestModel) {
let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask,true).last as NSString?
let filePath = path?.appendingPathComponent("test") ?? ""
do {
let data = try NSKeyedArchiver.archivedData(withRootObject: mo, requiringSecureCoding: true)
do {
_ = try data.write(to: URL(fileURLWithPath: filePath))
} catch {
print("data写入本地失败: (error.localizedDescription)")
}
} catch {
print("模型转换失败: (error.localizedDescription)")
}
}
func readModelFromFile() -> TestModel? {
// 路径
let file = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last as NSString?
// 拼接路径 自动带斜杠的
let filePath = file?.appendingPathComponent("test") ?? ""
do {
let data = try Data.init(contentsOf: URL(fileURLWithPath: filePath))
let model = try? NSKeyedUnarchiver.unarchivedObject(ofClass: TestModel.self, from: data)
return model
} catch {
print("获取data数据失败: (error)")
return nil
}
}
}
struct不能直接归档和接档,必须继承NSCoding协议,swift5.0还需要实现static var supportsSecureCoding: Bool { return true }
Struct实现归档和解档方案:
实现一个归档和解档协议:
public protocol Archivable {
func archive() -> NSDictionary
init?(unarchive: NSDictionary?)
}