CodingKeys для переименования
Сопоставляйте различные имена в JSON и свойствах.
«CodingKeys для переименования» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Зачем переименовывать ключи
API JSON часто использует имена, отличающиеся от имён свойств Swift, например first_name вместо firstName. Перечисление CodingKeys связывает эти имена, не изменяя интерфейс вашей модели.
import Foundation
struct User: Codable {
var firstName: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
}
}
print("CodingKeys maps firstName to first_name")Устройство CodingKeys
CodingKeys — это вложенное перечисление, соответствующее String, CodingKey. Каждый вариант соответствует имени свойства, а его исходное значение задаёт используемый ключ JSON.
import Foundation
struct Product: Codable {
var productName: String
var unitPrice: Double
enum CodingKeys: String, CodingKey {
case productName = "product_name"
case unitPrice = "unit_price"
}
}
print(Product.CodingKeys.productName.rawValue)Декодирование с переименованными ключами
При декодировании декодировщик ищет каждое свойство по исходному значению из CodingKeys, поэтому JSON в формате snake_case заполняет свойства в формате camelCase.
import Foundation
struct User: Codable {
var firstName: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
}
}
let json = "{\"first_name\":\"Ada\"}"
let u = try JSONDecoder().decode(User.self, from: json.data(using: .utf8)!)
print(u.firstName)Кодирование с переименованными ключами
Кодирование использует то же соответствие в обратном направлении: выходной JSON содержит ключи, заданные исходными значениями, а не имена свойств Swift.
import Foundation
struct User: Codable {
var firstName: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
}
}
let data = try JSONEncoder().encode(User(firstName: "Ada"))
print(String(data: data, encoding: .utf8)!)Перечисление всех свойств
После добавления перечисления CodingKeys в нём должен быть вариант для каждого свойства, которое вы хотите кодировать или декодировать. Варианты без исходного значения используют имя свойства без изменений.
import Foundation
struct Item: Codable {
var id: Int
var displayName: String
enum CodingKeys: String, CodingKey {
case id
case displayName = "display_name"
}
}
let data = try JSONEncoder().encode(Item(id: 1, displayName: "Pen"))
print(String(data: data, encoding: .utf8)!)Исключение свойства
Если не включить свойство в CodingKeys, оно исключается из кодирования и декодирования. У такого свойства должно быть значение по умолчанию, чтобы автоматически созданный инициализатор мог по-прежнему создать тип.
import Foundation
struct User: Codable {
var name: String
var cachedToken: String = "none"
enum CodingKeys: String, CodingKey {
case name
}
}
let u = try JSONDecoder().decode(User.self, from: "{\"name\":\"Ada\"}".data(using: .utf8)!)
print(u.name, u.cachedToken)Переименование нескольких ключей
Сопоставьте столько ключей, сколько нужно. Каждый вариант связывает свойство Swift с точным ключом JSON, которого ожидает сервер.
import Foundation
struct Account: Codable {
var userId: Int
var isVerified: Bool
enum CodingKeys: String, CodingKey {
case userId = "user_id"
case isVerified = "is_verified"
}
}
let json = "{\"user_id\":7,\"is_verified\":true}"
let a = try JSONDecoder().decode(Account.self, from: json.data(using: .utf8)!)
print(a.userId, a.isVerified)Сопоставление с более понятными именами
CodingKeys нужен не только для snake_case. Используйте его, чтобы переименовывать непонятные ключи API в ясные имена свойств Swift.
import Foundation
struct Reading: Codable {
var temperature: Double
enum CodingKeys: String, CodingKey {
case temperature = "t"
}
}
let json = "{\"t\":19.5}"
let r = try JSONDecoder().decode(Reading.self, from: json.data(using: .utf8)!)
print(r.temperature)CodingKeys во вложенных типах
У каждого типа Codable есть собственный CodingKeys. Вложенная структура может независимо переименовывать свои ключи, не затрагивая родительский тип.
import Foundation
struct Meta: Codable {
var createdAt: String
enum CodingKeys: String, CodingKey { case createdAt = "created_at" }
}
struct Doc: Codable { var title: String; var meta: Meta }
let json = "{\"title\":\"A\",\"meta\":{\"created_at\":\"today\"}}"
let d = try JSONDecoder().decode(Doc.self, from: json.data(using: .utf8)!)
print(d.meta.createdAt)Полный цикл с переименованными ключами
Одно и то же CodingKeys управляет обоими направлениями, поэтому значение кодируется в snake_case, а затем декодируется обратно в то же значение Swift.
import Foundation
struct User: Codable {
var firstName: String
var lastName: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
case lastName = "last_name"
}
}
let u = User(firstName: "Ada", lastName: "Lovelace")
let data = try JSONEncoder().encode(u)
let back = try JSONDecoder().decode(User.self, from: data)
print(back.firstName, back.lastName)Когда использовать CodingKeys
Используйте явное перечисление CodingKeys, когда отдельные ключи требуют точного управления, когда отличаются только некоторые ключи или когда нужно исключить свойство. Для API, в котором все имена используют snake_case, стратегия декодирования может быть проще.
import Foundation
struct Event: Codable {
var eventName: String
var startTime: String
enum CodingKeys: String, CodingKey {
case eventName = "name"
case startTime = "start_time"
}
}
let json = "{\"name\":\"Launch\",\"start_time\":\"10:00\"}"
let e = try JSONDecoder().decode(Event.self, from: json.data(using: .utf8)!)
print(e.eventName, e.startTime)Быстрая проверка: CodingKeys
Проверьте, как вы поняли переименование ключей.
Повторение: CodingKeys для переименования
Вы научились точно управлять ключами:
- Объявляйте
enum CodingKeys: String, CodingKeyвнутри типа. - Исходное значение каждого варианта — это ключ JSON; варианты управляют и кодированием, и декодированием.
- Перечисляйте каждое свойство, которое хотите кодировать; исключение свойства исключает его из обработки, поэтому ему нужно значение по умолчанию.
- У вложенных типов есть собственные независимые
CodingKeys.
Часто задаваемые вопросы
Урок «CodingKeys для переименования» бесплатный?
Да — полный текст урока «CodingKeys для переименования» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «CodingKeys для переименования»?
Сопоставляйте различные имена в JSON и свойствах. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «CodingKeys для переименования»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- CodingKeys для переименования
- Стратегии декодирования ключей и дат
- Ручные encode(to:) и init(from:)
- Декодирование неоднородного JSON