0Pricing
Swift Academy · Урок

Соответствие Codable

Автоматически делайте типы кодируемыми и декодируемыми.

«Соответствие Codable» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Что такое Codable

Codable — это псевдоним типа для Encodable & Decodable. Когда тип соответствует ему, Swift может преобразовать экземпляры во внешние данные (например, в JSON), а затем восстановить их — без необходимости вручную писать код разбора.

import Foundation

struct Book: Codable {
    var title: String
    var pages: Int
}

print("Book conforms to Codable")

Автоматический синтез

Если каждое хранимое свойство само соответствует Codable, компилятор автоматически генерирует за вас логику кодирования и декодирования. Вам нужно только перечислить свойства — Swift заполнит остальное.

import Foundation

struct User: Codable {
    var name: String
    var age: Int
    var isActive: Bool
}

let u = User(name: "Ada", age: 36, isActive: true)
print(u)

Кодирование в данные JSON

Значение Codable можно передать в JSONEncoder, который создаст блок данных Data. Преобразуйте эти Data в String, чтобы просмотреть текст JSON.

import Foundation

struct User: Codable {
    var name: String
    var age: Int
}

let u = User(name: "Ada", age: 36)
let data = try JSONEncoder().encode(u)
print(String(data: data, encoding: .utf8)!)

Декодирование из данных JSON

Обратное преобразование выполняет JSONDecoder. Передайте ему целевой тип и исходные Data, и он восстановит полностью типизированное значение Swift.

import Foundation

struct User: Codable {
    var name: String
    var age: Int
}

let json = "{\"name\":\"Ada\",\"age\":36}"
let data = json.data(using: .utf8)!
let u = try JSONDecoder().decode(User.self, from: data)
print(u.name, u.age)

Преобразование значения туда и обратно

После кодирования и последующего декодирования должно получиться равное значение. Такой полный цикл — быстрый способ убедиться, что соответствие типа Codable работает ожидаемым образом.

import Foundation

struct Point: Codable {
    var x: Int
    var y: Int
}

let p = Point(x: 3, y: 7)
let data = try JSONEncoder().encode(p)
let back = try JSONDecoder().decode(Point.self, from: data)
print(back.x, back.y)

Только Encodable

Можно соответствовать только одной из двух частей протокола. Encodable означает, что тип можно записать, но нельзя прочитать обратно. Это удобно для моделей ответов, которые не нужно разбирать.

import Foundation

struct Receipt: Encodable {
    var item: String
    var total: Double
}

let r = Receipt(item: "Coffee", total: 4.5)
let data = try JSONEncoder().encode(r)
print(String(data: data, encoding: .utf8)!)

Только Decodable

Аналогично, Decodable позволяет создавать тип из внешних данных, не поддерживая обратное кодирование. Это полезно для предназначенных только для чтения данных API, которые вы лишь используете.

import Foundation

struct Config: Decodable {
    var version: Int
    var debug: Bool
}

let json = "{\"version\":2,\"debug\":true}"
let data = json.data(using: .utf8)!
let c = try JSONDecoder().decode(Config.self, from: data)
print(c.version, c.debug)

Поддерживаемые типы свойств

Типы стандартной библиотеки, такие как String, Int, Double, Bool, Date, Data и URL, а также массивы и словари элементов Codable, поддерживают Codable без дополнительной настройки.

import Foundation

struct Profile: Codable {
    var name: String
    var tags: [String]
    var scores: [String: Int]
}

let p = Profile(name: "Sam", tags: ["a", "b"], scores: ["math": 90])
let data = try JSONEncoder().encode(p)
print(String(data: data, encoding: .utf8)!)

Перечисления тоже могут соответствовать протоколу

Перечисление с исходными значениями, например String или Int, автоматически становится Codable. В JSON оно кодируется как своё исходное значение.

import Foundation

enum Status: String, Codable {
    case active, paused, done
}

struct Task: Codable {
    var title: String
    var status: Status
}

let t = Task(title: "Ship", status: .active)
let data = try JSONEncoder().encode(t)
print(String(data: data, encoding: .utf8)!)

Свойство должно соответствовать Codable

Автоматическая генерация работает, только если все хранимые свойства поддерживают Codable. Если свойством служит пользовательский тип, он тоже должен соответствовать протоколу — иначе компилятор откажется выполнять генерацию.

import Foundation

struct Address: Codable {
    var city: String
}

struct Person: Codable {
    var name: String
    var address: Address
}

let p = Person(name: "Lee", address: Address(city: "Rome"))
print(try JSONEncoder().encode(p).count, "bytes")

Зачем нужен Codable

Codable избавляет от написания шаблонного кода сериализации вручную, сохраняет тип единым источником истины и обнаруживает несоответствия во время компиляции. Это стандартный способ передавать данные в приложения Swift и извлекать их из приложений.

import Foundation

struct Settings: Codable {
    var theme: String
    var fontSize: Int
}

let s = Settings(theme: "dark", fontSize: 14)
let data = try JSONEncoder().encode(s)
let back = try JSONDecoder().decode(Settings.self, from: data)
print(back.theme, back.fontSize)

Быстрая проверка: соответствие Codable

Проверьте, что вы узнали о соответствии протоколам.

Повторение: соответствие Codable

Вы изучили основы сериализации в Swift:

  • Codable = Encodable & Decodable.
  • Соответствие генерируется автоматически, если все свойства поддерживают Codable.
  • JSONEncoder создаёт Data, а JSONDecoder восстанавливает значение.
  • Поддерживаются стандартные типы, перечисления с исходными значениями и вложенные типы Codable.

Часто задаваемые вопросы

Урок «Соответствие Codable» бесплатный?

Да — полный текст урока «Соответствие Codable» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Соответствие Codable»?

Автоматически делайте типы кодируемыми и декодируемыми. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Соответствие Codable»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Соответствие Codable
  2. Кодирование с помощью JSONEncoder
  3. Декодирование с помощью JSONDecoder
  4. Работа с необязательными и вложенными типами
← Назад к Swift Academy