Это вторая статья о работе со 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
- .drop(while:) - пропускает все элементы, пока они соответствую условию в блоке. Как только пришел другой объект, ничего больше отбрасываться не будет. В примере 1 и 2 условие - треугольник. Пока они в начале - отбрасываются, а после звезды уже остаются. Позволяет отфильтровать стартовые данные, заголовки и др
- .drop(untilOutputFrom:) - пропускает все элементы потока, пока другой поток не выдаст сигнал. Например игнорировать таймер, пока не пришел флаг начала анимации
- .dropFirst - отбрасывает первый элемент в потоке
- .dropFirst(n) - отбрасывает первые N элементов в потоке
- .append(...) - добавляет к завершившемуся потоку набор данных в конец. В примере добавляются треугольник, звезда и звездочка
- .append( pub ) - добавляет к завершившемуся потоку данные из другого потока. В примере красная звездочка игнорируется, т.к. первый поток на тот момент не завершился, а остальные элементы добавляются в конец.
- .prepend(...) - добавляет в начало потока набор данных. В примере добавляются треугольник, звезда и звездочка
- .prepend( pub ) - добавляет в начало данные из завершившегося потока
- .prefix(n) - возвращает первые n элементов потока
- .prefix(untilOutputFrom:) - возвращает элементы потока, пока второй поток не выдаст сигнал
- .prefix(while: n) - возвращает элементы потока, пока они соответствуют условиям. После нарушения условия выдача останавливается
Select
- .first - возвращает первый элемент потока
- .first(where: ) - возвращает первый элемент потока, соответствующий условию в блоке
- .last - возвращает последний элемент завершившегося потока
- .last(where: ) - возвращает последний элемент завершившегося потока, соответствующий условию в блоке
- .output(at:) - возвращает элемент с определенным индексом из потока
- .output(in:) - возвращает элементы с индексами из диапазона
Collecting & Republishing
- .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, их можно скачать и запустить.
Пишите в комментариях интересующие вас темы для будущих статей, а чтобы их не пропустить - подписывайтесь на дневник.