> Как работает reduce в Swift (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: 2GIS

Стек: iOS, Swift

> Пример ответа

Метод reduce в Swift - это функция высшего порядка для последовательностей (массивов, словарей, строк и т.д.), которая сводит (сворачивает) все элементы коллекции в одно итоговое значение, последовательно применяя замыкание к каждому элементу с накопленным результатом.

Сигнатура:

SWIFT
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

Как работает:

  1. Принимает начальное значение (initialResult) - это "аккумулятор" на старте.

  2. Для каждого элемента коллекции вызывает замыкание nextPartialResult, передавая текущее значение аккумулятора и текущий элемент.

  3. Результат замыкания становится новым значением аккумулятора для следующей итерации.

  4. После обработки всех элементов возвращает финальное значение аккумулятора.

Пример: сумма чисел

SWIFT
let numbers = [1, 2, 3, 4]
let sum = numbers.reduce(0) { $0 + $1 }
// Или сокращенно: numbers.reduce(0, +)
// Результат: 10

Здесь 0 - начальное значение. На первой итерации: 0 + 1 = 1, затем 1 + 2 = 3, 3 + 3 = 6, 6 + 4 = 10.

Пример: конкатенация строк

SWIFT
let words = ["Hello", " ", "World"]
let sentence = words.reduce("") { $0 + $1 } // "Hello World"

Важные нюансы:

  • reduce не изменяет исходную коллекцию, а возвращает новое значение.

  • Для изменяемых аккумуляторов (например, массивов) используйте reduce(into:_:), чтобы избежать лишних копирований:

SWIFT
let numbers = [1, 2, 3, 4]
let evenSquares = numbers.reduce(into: [Int]()) { result, number in
if number.isMultiple(of: 2) {
result.append(number * number)
}
}
// [4, 16]
  • reduce - это аналог fold в других языках (Haskell, Kotlin, JavaScript). В Swift также есть reduce(into:) для мутабельных аккумуляторов, который эффективнее при работе со ссылочными типами.

Производительность: reduce имеет сложность O(n), где n - количество элементов. Для простых операций (сложение, умножение) он оптимален, но для сложных трансформаций с созданием новых объектов может быть менее эффективным, чем reduce(into:).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью