Соответствие 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 — локальная установка не требуется.
Все уроки этого курса
- Соответствие Codable
- Кодирование с помощью JSONEncoder
- Декодирование с помощью JSONDecoder
- Работа с необязательными и вложенными типами