Вопрос проверяет понимание устройства протокола Codable и направления преобразования данных.
Encodable отвечает за кодирование модели в данные. Decodable — за создание модели из данных. Codable объединяет оба протокола. Можно использовать только один из них, если требуется одностороннее преобразование. Это дает гибкость при проектировании моделей.
Хотя чаще всего используют Codable, на самом деле он состоит из двух отдельных протоколов с разной ответственностью.
Encodable используется, когда объект нужно превратить в данные.
Типичные сценарии:
Отправка данных на сервер.
Сохранение объекта в файл.
Логирование состояния.
Пример:
struct CreateUserRequest: Encodable {
let name: String
let email: String
}
Здесь модель не предназначена для чтения из JSON, только для отправки.
Decodable используется, когда объект создается из данных.
Типичные сценарии:
Ответы сервера.
Загрузка конфигураций.
Чтение данных из хранилища.
Пример:
struct UserResponse: Decodable {
let id: Int
let name: String
}
Codable = Encodable & Decodable.
Используется, когда модель:
Приходит с сервера.
Может быть изменена.
Отправляется обратно.
Пример:
struct User: Codable {
let id: Int
let name: String
}
Перед выводом важно подчеркнуть практическую пользу:
модели становятся более точными по назначению;
уменьшается риск использовать модель не по сценарию;
API становится более выразительным.
Если модель используется только для чтения или только для отправки — стоит ограничиться Decodable или Encodable. Codable удобно применять для универсальных моделей, участвующих в двухстороннем обмене данными.