Создание конвейеров
Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 31 из 56.
Методы, которые вы изучили: map, filter, reduce, compactMap, flatMap, sorted(by:) — это повседневный инструментарий Swift. В реальном коде они связываются воедино.
struct Order {
let item: String
let qty: Int
}
let orders = [Order(item: "apple", qty: 3), Order(item: "bread", qty: 0), Order(item: "milk", qty: 5)]
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
print(names) // ["milk", "apple"]Читайте цепочку сверху вниз: оставьте непустые заказы, отсортируйте по количеству в порядке убывания, затем оставьте только названия.
Конвейеры выигрывают, когда у каждого шага есть одна цель. Если вы обнаружите, что выполняете два действия одновременно внутри замыкания (отображение и фильтрацию), разделите их на два шага. Цепочка остается читаемой по мере ее роста.
Задание
СреднеПрочитайте одну строку ввода: список записей name:price:qty, разделенных запятыми. Некоторые записи сформированы некорректно и должны быть пропущены: любая запись, в которой цена (price) или количество (qty) не являются целыми числами.
Создайте конвейер обработки, который выводит по одной строке для каждой корректной записи с qty > 0, отсортированных по общей стоимости (price * qty) по убыванию, в формате:
<name>: <total>После строк для каждого элемента выведите одну итоговую строку: Sum: <n> с общей суммой.
Для входных данных apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7 вывод будет следующим:
milk: 20
salt: 14
apple: 6
Sum: 40Шпаргалка
Цепочки функций высшего порядка создают читаемые конвейеры, где каждый шаг имеет одну цель:
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
Распространенные методы конвейера: filter → compactMap → sorted(by:) → map → reduce. Если замыкание делает две вещи одновременно (например, преобразование и фильтрацию), разделите его на два шага.
Попробуйте сами
let entries = readLine()!.components(separatedBy: ",")
// TODO: конвейер с использованием compactMap (парсинг), filter (qty > 0),
// sorted (total по убыванию), map (форматирование); вывод строк + Sum
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря3Словари
Объявление словарейБезопасный поискОбновление словарейИтерация по словарямГруппировка значенийИтоги — Инвентарь6Функции высшего порядка, часть 2
compactMapflatMapsorted(by:)Создание конвейеровПовторение — Таблица лидеров