Make SwiftData Codable

When moving from Core Data to Swift Data, it’s not obvious how to make the data model codable, a must for reading or writing JSON files or API’s to/from the persistent storage.

A way to do it is to manually add Codekeys so that the @Model knows that the data types are supported. Here is the code

import SwiftUI
import SwiftData

@Model
class Persons: Codable {
    enum CodingKeys: CodingKey {
        case firstName, lastName, phoneNumber
    }
    let firstName: String
    let lastName: String
    let phoneNumber: String
    
    init(firstName: String, lastName: String, phoneNumber: String) {
        self.firstName = firstName
        self.lastName = lastName
        self.phoneNumber = phoneNumber
    }
    
    // Decode
    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.firstName = try container.decode(String.self, forKey: .firstName)
        self.lastName = try container.decode(String.self, forKey: .lastName)
        self.phoneNumber = try container.decode(String.self, forKey: .phoneNumber) 
        // See alternative below
        
        // If there are possibilities that a field contains NULL,
        //then the following code can be used (in this case instead of above)
        if let phoneNumber =  try container.decodeIfPresent(String.self, forKey:            .phoneNumber) {
                    self.phoneNumber = phoneNumber
                }else {
                    self.phoneNumber = ""
                }
        // End of alternative code
    }
    
    //Encode
    func encode(to encoder: Encoder)  throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(firstName, forKey: .firstName)
        try container.encode(lastName, forKey: .lastName)
        try container.encode(phoneNumber, forKey: .phoneNumber)
    } 
}

Leave a Reply

Your email address will not be published. Required fields are marked *