compactMap
Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 28 из 56.
compactMap — это map с отфильтрованными опциональными значениями. Замыкание может возвращать Optional; compactMap отбрасывает результаты nil и извлекает значения из остальных.
let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
print(numbers) // [3, 7, 1]Int("hi") возвращает nil, потому что он не может извлечь число из "hi". compactMap автоматически отбрасывает их и возвращает вам чистый [Int].
Без этого вам пришлось бы писать strings.map { Int($0) } и получить [Int?] с примесью nil, а затем самостоятельно их отфильтровывать. compactMap выполняет оба этих шага за один раз.
Задание
ЛегкоПрочитайте одну строку ввода: смесь целых чисел и мусора, разделенных запятыми (некоторые записи невозможно преобразовать в числа).
Выведите:
- Целые числа (в порядке ввода), разделенные
, - Количество отброшенных записей (которые не удалось преобразовать)
- Сумму преобразованных целых чисел
Для ввода 3,hi,7,!,1,42,oops результатом будет:
3,7,1,42
3
53Шпаргалка
compactMap работает так же, как map, но автоматически удаляет результаты nil и разворачивает остальные:
let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
// [3, 7, 1] — значения nil из строк, которые не удалось преобразовать, отбрасываютсяБез compactMap, map вернул бы [Int?] с примесью nil, что потребовало бы отдельного шага фильтрации.
Попробуйте сами
let parts = readLine()!.components(separatedBy: ",")
// TODO: compactMap в целые числа; вывести объединенную строку, количество отброшенных элементов, сумму
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаря3Словари
Объявление словарейБезопасный поискОбновление словарейИтерация по словарямГруппировка значенийИтоги — Инвентарь6Функции высшего порядка, часть 2
compactMapflatMapsorted(by:)Создание конвейеровПовторение — Таблица лидеров