L'elenco delle chiavi da codificare / decodificare è controllato da un tipo chiamato CodingKeys(nota salla fine). Il compilatore può sintetizzarlo per te ma può sempre sovrascriverlo.
Supponiamo che tu voglia escludere la proprietà nicknamesia dalla codifica che dalla decodifica:
struct Person: Codable {
var firstName: String
var lastName: String
var nickname: String?
private enum CodingKeys: String, CodingKey {
case firstName, lastName
}
}
Se vuoi che sia asimmetrico (cioè codificare ma non decodificare o viceversa), devi fornire le tue implementazioni di encode(with encoder: )e init(from decoder: ):
struct Person: Codable {
var firstName: String
var lastName: String
var fullName: String {
return firstName + " " + lastName
}
private enum CodingKeys: String, CodingKey {
case firstName
case lastName
case fullName
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
firstName = try container.decode(String.self, forKey: .firstName)
lastName = try container.decode(String.self, forKey: .lastName)
}
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(fullName, forKey: .fullName)
}
}
CodingKeysè sufficiente darle un valore predefinito e lasciarlo fuori dall'enum.