Menu
Coddy logo textTech

Создание конвейеров

Часть раздела Логика и управление потоком путешествия по 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"]

Читайте цепочку сверху вниз: оставьте непустые заказы, отсортируйте по количеству в порядке убывания, затем оставьте только названия.

Конвейеры выигрывают, когда у каждого шага есть одна цель. Если вы обнаружите, что выполняете два действия одновременно внутри замыкания (отображение и фильтрацию), разделите их на два шага. Цепочка остается читаемой по мере ее роста.

challenge icon

Задание

Средне

Прочитайте одну строку ввода: список записей 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 }

Распространенные методы конвейера: filtercompactMapsorted(by:)mapreduce. Если замыкание делает две вещи одновременно (например, преобразование и фильтрацию), разделите его на два шага.

Попробуйте сами

let entries = readLine()!.components(separatedBy: ",")

// TODO: конвейер с использованием compactMap (парсинг), filter (qty > 0),
// sorted (total по убыванию), map (форматирование); вывод строк + Sum
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком