Menu
Coddy logo textTech

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 выполняет оба этих шага за один раз.

challenge icon

Задание

Легко

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

Выведите:

  1. Целые числа (в порядке ввода), разделенные ,
  2. Количество отброшенных записей (которые не удалось преобразовать)
  3. Сумму преобразованных целых чисел

Для ввода 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 в целые числа; вывести объединенную строку, количество отброшенных элементов, сумму
quiz iconПроверьте себя

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

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