[swift-users] Robust Codable coding

Howard Lovatt howard.lovatt at gmail.com
Fri Jun 23 19:36:33 CDT 2017


Hi All,

I have started to use Codable and was looking for some advice. I want to make the persisted data structure robust so that if I change the properties as the code develops the new code can deserialise an old saved file. This is what I am currently doing:


struct Project: Codable {
    var ecsVersion = 0
    var comment = ""
    
    init() {}
    
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        ecsVersion = try values.decodeIfPresent(Int.self, forKey: .ecsVersion) ?? ecsVersion
        comment = try values.decodeIfPresent(String.self, forKey: .comment) ?? comment
    }
}

The idea is that if I add fields the deserialisation doesn’t fail provided that I provide a default value. However this presumably fails when you delete a field because CodingKeys is now incorrect. (I say presumably because the documentation doesn’t say what will happen.) Though not ideal, I can leave disused properties in Projects to prevent the deserialisation error.

Any advice? Is there a better way?

Thanks in advance,

 — Howard.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170624/538338c6/attachment.html>


More information about the swift-users mailing list