Swift 解档归档

95 阅读1分钟

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     }

WeChat5a6b88cc849a4ec953871736cbcd5ced.png

Struct实现归档和解档方案:

实现一个归档和解档协议:

public protocol Archivable {
    func archive() -> NSDictionary
    init?(unarchive: NSDictionary?)
}