Swift имеет много интересных особенностей, одна из которых — FlatMap. Эта интересная особенность способна превратить не самый красивый код в великолепный.

В примере, на котором мы рассмотрим FlatMap мы будем получать данные в формате JSON и преобразуем их в массив. JSON-файл, с которым мы будем работать, лежит в папке Resources в Playground, который вы можете скачать в конце статьи.

Функция, которую мы напишем, будет асинхронна, поэтому в ней будет замыкание, возврщающее результат или ошибку.

FlatMap: Приступим

Для начала напишем небольшую структуру, описывающую данные, которые мы собираемся получать.

После этого давайте напишем расширение для структуры, в котором создадим инициализатор, принимающий словарь для заполнения полей структуры.

FlatMap: Получение данных с сервера

Первым делом, давайте создадим список возможных ошибок, с которыми программа может столкнуться при обращении к серверу:

И сейчас мы объявим замыкание, которое по выполнению будет возвращать нам либо ошибку, либо массив данных, описанных в структуре выше:

Напишем типичный метод для загрузки данных с сервера:

Наш код в порядке, он работает, как и ожидалось. Но он не выглядит хорошо. Мы можем немного улучшить его.

FlatMap: Swift-способ

Чистый и лаконичный код, не так ли?

Что же происходит в коде?

Этот код применяет flatMap к данным, пытаясь преобразовать данные в json-массив словарей. Этот код возвратит либо nil, либо заполненный json-массив словарей.

Здесь на массив json мы применили flatmap и передали функцию, которая будет выполняться для каждого элемента. Каждый элемент — это [String: Any], так что SomeData.init(with:) — идеальный путь для приведения к flatMap. Мы возвратили массив [SomeData]?, и у нас не может возникнуть ошибок в процессе, так как faltMap отсеет все nil, так что любая неудача при загрузке на конечно результате не отразится.

Посмотрите на код, который мы написали выше (типичный метод для загрузки данных с сервера), и теперь посмотрите на новый flatmap-код. Мы обошлись без if, guard. И нам не нужно ожидать, пока метод получит и вернет весь результат, в надежде на то, что все данные будут получены успешно.

Итак, в итоге у нас есть опциональный массив SomeData и дополнительный объект-ошибка, которые мы можем передать в замыкание.

Скачать итоговый Playground

Опубликовал Игорь Малеваный

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *