Что такое протокол Codable в Swift и для чего он нужен?

«Что такое протокол Codable в Swift и для чего он нужен?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Codable — это тип-псевдоним (typealias) в Swift, объединяющий протоколы Encodable и Decodable. Он предназначен для сериализации (кодирования) и десериализации (декодирования) типов данных в/из внешних форматов, таких как JSON или Property List (plist).

Основное назначение:

  • Автоматическое преобразование структур и классов Swift в данные (например, для отправки на сервер).
  • Автоматическое создание объектов Swift из полученных данных (например, ответа от сервера).

Пример использования с JSON:

// 1. Объявляем тип, соответствующий Codable
struct User: Codable {
    let id: Int
    let name: String
    let email: String
}

// 2. Декодирование JSON в объект Swift
let jsonString = """
{
    "id": 42,
    "name": "Иван",
    "email": "ivan@example.com"
}
"""

let jsonData = Data(jsonString.utf8)
let decoder = JSONDecoder()
let user = try decoder.decode(User.self, from: jsonData)
print(user.name) // Вывод: Иван

// 3. Кодирование объекта Swift в JSON
let newUser = User(id: 100, name: "Анна", email: "anna@example.com")
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let encodedData = try encoder.encode(newUser)
if let jsonString = String(data: encodedData, encoding: .utf8) {
    print(jsonString)
}

Ключевые особенности:

  • Автоматический синтез: Компилятор автоматически генерирует код для кодирования/декодирования, если все свойства типа также соответствуют Codable.
  • Кастомизация: При необходимости можно переопределить процесс, реализовав протокол CodingKey для сопоставления с другими именами ключей или создав собственный инициализатор init(from:) и метод encode(to:).
  • Поддержка форматов: Работает не только с JSONEncoder/JSONDecoder, но и с PropertyListEncoder/PropertyListDecoder.

Практический совет: Используйте Codable для работы с сетевыми запросами и локальным сохранением структурированных данных. Это избавляет от написания ручного парсинга.