iOS
201
и восстанавливать их позже. Преобразование экземпляра описанной выше
структуры
Author
в формат JSON будет выглядеть примерно так:
struct Author: Codable {
let name: String
}
let author = Author(name: "Mike")
let rawData = try? JSONEncoder().encode(author)
Как видите, здесь мы добавили в объявление нашего объекта протокол
Cod
able
. Этот протокол является составной частью двух других протоколов:
Encod
able
и
Decodable
. Они предлагают набор функций, которые компилятор Swift
способен интерпретировать через некоторый синтаксический сахар и ожида
-
емые значения.
Объекты, поддерживающие протокол
Codable
, должны реализовать методы
encode(to:)
и
init(from:)
. В их отсутствие компилятор Swift попытается при
-
менить специальную логику и сгенерировать свои версии этих методов. Для
этого он просмотрит свойства объекта и внесет изменения в специальный
вложенный тип перечисления
CodingKeys
. Используя это перечисление, компи
-
лятор сможет сгенерировать правильные реализации
encode(to:)
и
init(from:)
.
Вы можете назвать это волшебством, но на самом деле компилятор просто
принимает прагматичные решения относительно кода.
В нашем примере это проявляется в том, что
JSONEncoder
получает возмож
-
ность преобразовать объект
author
в представление, пригодное для сохранения
в локальном хранилище на устройстве или для отправки на сервер.
Протокол
Codable
также помогает в обратном преобразовании (или «десериа-
лизации») объекта из формата JSON. Вот как это выглядит:
let rawJson = String("{\"name\":\"Mike\"}").data(using: .utf8)!
let author = try? JSONDecoder().decode(Author.self, from: rawJson)
Сначала этот код создает объект
Data
с именем
rawJson
, содержащий стро
-
ку в формате JSON, которая могла быть получена от сервера. Затем эта строка
передается в метод
decode(_:from:)
экземпляра
JSONDecoder
. Этот метод также
принимает тип объекта, который требуется получить; в данном случае мы пе
-
редаем
Author.self
– структуру
Author
, определенную в предыдущем примере.
JSONDecoder
декодирует строку в объект с именем
author
.
Если экземпляру
JSONDecoder
передать тип объекта, который он не сможет создать
из данных в формате JSON, это приведет к ошибке. Мы добавили к вызову метода
try?
, чего достаточно для такого простого примера, но в действующем приложении
такие ситуации желательно обрабатывать и выводить сообщения на экран или
в журнал.
Протокол
Codable
обладает намного более широкими возможностями, чем
было показано, но их обсуждение выходит за рамки этой главы.
А теперь поговорим о другом популярном транспортном формате: XML.
Do'stlaringiz bilan baham: