0Pricing
Swift Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. CodingKeys для переименования
  2. Стратегии декодирования ключей и дат
  3. Ручные encode(to:) и init(from:)
  4. Декодирование неоднородного JSON
← Назад к Swift Academy