Найти тему

Swift Combine - Часть 2

Оглавление

Это вторая статья о работе со Swift Combine, в ней я расскажу про математические операции, поиск совпадений, операции с элементами по индексам, выбор и объединение потоков. Ссылка на первую статью

В этой статье вы прочитаете:

  • Операции
  • Math
    Matching
    Sequence
    Select
    Collecting & Republishing

Примеры кода из этой статьи доступны на GitHub

Операции и преобразования

Данные в Combine можно преобразовывать, менять потоки, фильтровать. Все они логически разбиты на блоки. Ниже я опишу каждый блок, входящие в него методы, что они делают и приведу диаграммы, показывающие вход и выход.

У некоторых операций есть try... вариант, который позволяет вернуть ошибку, но я их дополнительно не описывал.

Math

  • .count - подсчитывает количество объекто в возвращает число
  • .max - возращает самый большой объект. Он должен соответствовать Comparable. В примере просто сравниваются числа
  • .max(by ) - возвращает самый большой объект, но сравнение выполняется в блоке. В примере числа красных объектов умножаются на 10
  • .min - возращает самый маленький объект. Он должен соответствовать Comparable. В примере просто сравниваются числа
  • .min(by ) - возвращает самый маленький объект, но сравнение выполняется в блоке. В примере числа красных объектов умножаются на 10

Matching

  • .contains - возвращает bool, есть ли объект в потоке. Он должен соответствовать Equitable. В примерах 1 и 2 ищется синий треугольник
  • .contains(where: ) - возвращает bool, есть ли объект в потоке, но сравнение выполняется в блоке. В примере 3 ищется любой треугольник
  • .allSatisfy - возвращает bool, если все объекты соответствует условию в блоке. В примере ищутся звездочки

Sequence

-2
  • .drop(while:) - пропускает все элементы, пока они соответствую условию в блоке. Как только пришел другой объект, ничего больше отбрасываться не будет. В примере 1 и 2 условие - треугольник. Пока они в начале - отбрасываются, а после звезды уже остаются. Позволяет отфильтровать стартовые данные, заголовки и др
  • .drop(untilOutputFrom:) - пропускает все элементы потока, пока другой поток не выдаст сигнал. Например игнорировать таймер, пока не пришел флаг начала анимации
  • .dropFirst - отбрасывает первый элемент в потоке
  • .dropFirst(n) - отбрасывает первые N элементов в потоке
  • .append(...) - добавляет к завершившемуся потоку набор данных в конец. В примере добавляются треугольник, звезда и звездочка
  • .append( pub ) - добавляет к завершившемуся потоку данные из другого потока. В примере красная звездочка игнорируется, т.к. первый поток на тот момент не завершился, а остальные элементы добавляются в конец.
  • .prepend(...) - добавляет в начало потока набор данных. В примере добавляются треугольник, звезда и звездочка
  • .prepend( pub ) - добавляет в начало данные из завершившегося потока
  • .prefix(n) - возвращает первые n элементов потока
  • .prefix(untilOutputFrom:) - возвращает элементы потока, пока второй поток не выдаст сигнал
  • .prefix(while: n) - возвращает элементы потока, пока они соответствуют условиям. После нарушения условия выдача останавливается
-3

Select

-4
  • .first - возвращает первый элемент потока
  • .first(where: ) - возвращает первый элемент потока, соответствующий условию в блоке
  • .last - возвращает последний элемент завершившегося потока
  • .last(where: ) - возвращает последний элемент завершившегося потока, соответствующий условию в блоке
  • .output(at:) - возвращает элемент с определенным индексом из потока
  • .output(in:) - возвращает элементы с индексами из диапазона

Collecting & Republishing

-5
  • .combineLatest( pub ) { a,b } - комбинирует элемент последнего сигнала потока с последним элементом другого потока. В примере сначала приходят красная звезда в потоке 1 и оранжевая единица в потоке 2, получается их пара. Затем в потоке 1 приходит синяя звезда и она комбинируется с оранжевой единицей в потоке 2. Фиолетовая двойка в потоке 2 приходит в тот же временной слот, но все-таки после синей звезды. И там по очереди Поток 1, Поток 2 приходят и сочетаются с последним сигналом другого потока
  • .combineLatest( pub ) { tuple } - у метода есть другой вариант, который возвращает не два параметра, а один tuple
  • .combineLatest ABC и ABCD - выполняет такие же операции, но сочетая 3 и 4 потока
  • .merge - склеивает несколько поток в один по мере поступления данных
  • .zip - собирает потоки в пары / тройки / четверки в порядке их следования в потоках. Сначала все первые элементы, потом все вторые и т.д. Поэтому на одинаковых данных zip дает 3 пары элементов, а combineLatest - 5

Заключение

В этой статье кратко рассмотрены операции групп Math, Matching, Sequence, Select, Collecting и Republishing с визуализацией. Все визуализации получены в приложении-песочнице.

В последней статье я расскажу про операции для работы с несколькими потоками вместе, тайминги, входы/выходы и работу приложения-песочницы.

Все работающие примеры preview есть в проекте на Github, их можно скачать и запустить.

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