Вот хороший пост в блоге, который включает ответ на ваш вопрос: источник
Прокрутите вниз до наследования, и вы увидите следующее:
Предполагая, что у нас есть следующие классы:
class Person : Codable {
var name: String?
}
class Employee : Person {
var employeeID: String?
}
Мы получаем соответствие Codable путем наследования от класса Person, но что произойдет, если мы попытаемся закодировать экземпляр Employee?
let employee = Employee()
employee.employeeID = "emp123"
employee.name = "Joe"
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try! encoder.encode(employee)
print(String(data: data, encoding: .utf8)!)
{
"name" : "Joe"
}
Это не ожидаемый результат, поэтому мы должны добавить пользовательскую реализацию, подобную этой:
class Person : Codable {
var name: String?
private enum CodingKeys : String, CodingKey {
case name
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(name, forKey: .name)
}
}
Та же история для подкласса:
class Employee : Person {
var employeeID: String?
private enum CodingKeys : String, CodingKey {
case employeeID = "emp_id"
}
override func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(employeeID, forKey: .employeeID)
}
}
Результат будет:
{
"emp_id" : "emp123"
}
Что опять-таки не является ожидаемым результатом, поэтому здесь мы используем наследование , вызывая super .
// Employee.swift
override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(employeeID, forKey: .employeeID)
}
Что в итоге дает нам то, чего мы действительно хотели с самого начала:
{
"name": "Joe",
"emp_id": "emp123"
}
Если вас не устраивает сглаженный результат, есть совет, как этого избежать.
Все благодарности парню, который написал пост в блоге, и мое спасибо.
Надеюсь, это поможет вам, ура!