Назначение: Выполняет операцию для каждого элемента коллекции
Возвращает: Ничего (Void)
Особенности: Не создает новую коллекцию
let numbers = [1, 2, 3]
numbers.forEach { print($0) }
// Вывод:
// 1
// 2
// 3
Назначение: Трансформирует каждый элемент коллекции
Возвращает: Новую коллекцию того же размера
Использование: Когда нужно преобразовать все элементы
let squared = numbers.map { $0 * $0 }
// [1, 4, 9]
Назначение:
let nested = [[1, 2], [3, 4]]
let flat = nested.flatMap { $0 }
// [1, 2, 3, 4]
Назначение: Трансформирует с фильтрацией nil-значений
Возвращает: Коллекцию без nil
let strings = ["1", "2", "three"]
let nums = strings.compactMap { Int($0) }
// [1, 2]
Назначение: Фильтрация элементов по условию
Возвращает: Новую коллекцию (возможно, меньшего размера)
let evens = numbers.filter { $0 % 2 == 0 }
// [2]
Назначение: Агрегация элементов в одно значение
Параметры: Начальное значение и функция комбинирования
let sum = numbers.reduce(0) { $0 + $1 }
// 6
Комбинирует две коллекции в пары:
let names = ["Alice", "Bob"]
let scores = [85, 92]
let results = zip(names, scores)
// [("Alice", 85), ("Bob", 92)]
Сортировка с кастомным компаратором:
let sortedNames = names.sorted { $0.count > $1.count }
Поиск первого/последнего элемента по условию:
let firstEven = numbers.first { $0 % 2 == 0 }
// 2
Проверка наличия элемента:
let hasEven = numbers.contains { $0 % 2 == 0 }
// true
Получение первых/последних n элементов:
let firstTwo = numbers.prefix(2)
// [1, 2]
Пропуск элементов:
let afterFirst = numbers.dropFirst()
// [2, 3]
Отложенные вычисления:
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
- трансформация с фильтрацией nilfilter
- фильтрацияreduce
- агрегацияДругие техники FP:
zip
, lazy
, first(where:)
и др.Применяйте функциональный подход для: