Вопрос проверяет знание механизмов кастомного маппинга данных при декодировании JSON в модели Swift.
Если ключи JSON отличаются от имен свойств модели, используется CodingKeys. Это перечисление позволяет явно сопоставить JSON-ключи и свойства Swift. Такой подход сохраняет читаемые имена свойств в коде. При необходимости можно реализовать кастомный init(from:). Это стандартный и безопасный способ работы с несовпадающими ключами.
На практике почти всегда JSON от сервера не идеально совпадает с неймингом в Swift, поэтому важно уметь корректно настраивать маппинг.
CodingKeys — это перечисление, которое определяет соответствие между ключами JSON и свойствами модели.
JSON:
{
"user_id": 10,
"user_name": "Alex"
}
Модель:
struct User: Decodable {
let id: Int
let name: String
enum CodingKeys: String, CodingKey {
case id = "user_id"
case name = "user_name"
}
}
Что здесь важно:
Имена свойств остаются id и name.
JSON-ключи инкапсулированы внутри модели.
Внешний код не знает о формате JSON.
Иногда формат данных сложнее стандартного сопоставления.
Типичные случаи:
Вложенные объекты.
Опциональные или условные поля.
Разные типы данных (строка вместо числа).
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(Int.self, forKey: .id)
name = try container.decodeIfPresent(String.self, forKey: .name) ?? "Unknown"
}
Иногда используют:
keyDecodingStrategy = .convertFromSnakeCase для простых случаев.
DTO-модели, которые маппятся в domain-модели вручную.
CodingKeys — основной и рекомендуемый способ работы с несовпадающими ключами JSON. Кастомное декодирование стоит применять только тогда, когда стандартного механизма недостаточно.