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)
}
}