Что такое forEach/map/flatMap/compactMap/filter/reduce? Какие еще примеры функционального программирования вы знаете в Swift?ios-38

Основные методы высшего порядка

1. forEach

Назначение: Выполняет операцию для каждого элемента коллекции
Возвращает: Ничего (Void)
Особенности: Не создает новую коллекцию

let numbers = [1, 2, 3]
numbers.forEach { print($0) }
// Вывод:
// 1
// 2
// 3

2. map

Назначение: Трансформирует каждый элемент коллекции
Возвращает: Новую коллекцию того же размера
Использование: Когда нужно преобразовать все элементы

let squared = numbers.map { $0 * $0 }
// [1, 4, 9]

3. flatMap

Назначение:

  1. Преобразует и "разглаживает" (flattens) коллекцию коллекций
  2. Вариант с опционалами (устарел, теперь используется compactMap)
let nested = [[1, 2], [3, 4]]
let flat = nested.flatMap { $0 }
// [1, 2, 3, 4]

4. compactMap

Назначение: Трансформирует с фильтрацией nil-значений
Возвращает: Коллекцию без nil

let strings = ["1", "2", "three"]
let nums = strings.compactMap { Int($0) }
// [1, 2]

5. filter

Назначение: Фильтрация элементов по условию
Возвращает: Новую коллекцию (возможно, меньшего размера)

let evens = numbers.filter { $0 % 2 == 0 }
// [2]

6. reduce

Назначение: Агрегация элементов в одно значение
Параметры: Начальное значение и функция комбинирования

let sum = numbers.reduce(0) { $0 + $1 }
// 6

Другие методы функционального программирования

1. zip

Комбинирует две коллекции в пары:

let names = ["Alice", "Bob"]
let scores = [85, 92]
let results = zip(names, scores)
// [("Alice", 85), ("Bob", 92)]

2. sorted

Сортировка с кастомным компаратором:

let sortedNames = names.sorted { $0.count > $1.count }

3. first/last

Поиск первого/последнего элемента по условию:

let firstEven = numbers.first { $0 % 2 == 0 }
// 2

4. contains

Проверка наличия элемента:

let hasEven = numbers.contains { $0 % 2 == 0 }
// true

5. prefix/suffix

Получение первых/последних n элементов:

let firstTwo = numbers.prefix(2)
// [1, 2]

6. drop

Пропуск элементов:

let afterFirst = numbers.dropFirst()
// [2, 3]

7. lazy

Отложенные вычисления:

let bigArray = (1...1000000)
let result = bigArray.lazy.map { $0 * 2 }.first!
// Вычисляется только первый элемент

Комбинирование методов

Пример цепочки преобразований:

let transactions = [100, -20, 50, -30]
let positiveSum = transactions
    .filter { $0 > 0 }
    .reduce(0, +)
// 150

Производительность

  • Преимущества: Лаконичность, читаемость, иммутабельность
  • Недостатки: Каждый вызов создает новую коллекцию (используйте lazy для больших данных)

Резюмируем

Основные методы:

  • forEach - итерация
  • map - трансформация
  • flatMap - разглаживание
  • compactMap - трансформация с фильтрацией nil
  • filter - фильтрация
  • reduce - агрегация

Другие техники FP:

  • Композиция функций
  • Неизменяемые данные
  • Чистые функции
  • Использование zip, lazy, first(where:) и др.

Применяйте функциональный подход для:

  • Обработки коллекций
  • Чистого и декларативного кода
  • Упрощения сложных преобразований данных