В чем разница между map, flatMap, compactMap и filter в Swift?

«В чем разница между map, flatMap, compactMap и filter в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это методы высшего порядка для преобразования и фильтрации последовательностей.

  • map(_:) — Трансформирует каждый элемент, возвращая массив результатов того же размера.

    let numbers = [1, 2, 3]
    let squared = numbers.map { $0 * $0 } // [1, 4, 9]
  • flatMap(_:) (для последовательностей) — Трансформирует и затем «сплющивает» (объединяет) результат, если преобразование возвращает последовательность.

    let pairs = [[1, 2], [3, 4]]
    let flattened = pairs.flatMap { $0 } // [1, 2, 3, 4]
  • compactMap(_:) — Трансформирует, отфильтровывая nil значения из результата. Размер итогового массива может быть меньше.

    let strings = ["1", "2", "three"]
    let numbers = strings.compactMap { Int($0) } // [1, 2]
  • filter(_:) — Возвращает только те элементы, которые удовлетворяют заданному условию (предикату).

    let evens = numbers.filter { $0 % 2 == 0 } // [2]
Краткое сравнение: Метод Вход Выход Ключевое действие
map [T] [U] 1-to-1 преобразование
flatMap [T] [U] Преобразование + слияние вложенных коллекций
compactMap [T] [U] Преобразование + удаление nil
filter [T] [T] Отбор по условию