> Как работает reduce в Swift (iOS, Swift)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: 2GIS
Стек: iOS, Swift
> Пример ответа
Метод reduce в Swift - это функция высшего порядка для последовательностей (массивов, словарей, строк и т.д.), которая сводит (сворачивает) все элементы коллекции в одно итоговое значение, последовательно применяя замыкание к каждому элементу с накопленным результатом.
Сигнатура:
SWIFTfunc reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
Как работает:
-
Принимает начальное значение (
initialResult) - это "аккумулятор" на старте. -
Для каждого элемента коллекции вызывает замыкание
nextPartialResult, передавая текущее значение аккумулятора и текущий элемент. -
Результат замыкания становится новым значением аккумулятора для следующей итерации.
-
После обработки всех элементов возвращает финальное значение аккумулятора.
Пример: сумма чисел
SWIFTlet 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.
Пример: конкатенация строк
SWIFTlet words = ["Hello", " ", "World"]let sentence = words.reduce("") { $0 + $1 } // "Hello World"
Важные нюансы:
-
reduceне изменяет исходную коллекцию, а возвращает новое значение. -
Для изменяемых аккумуляторов (например, массивов) используйте
reduce(into:_:), чтобы избежать лишних копирований:
SWIFTlet numbers = [1, 2, 3, 4]let evenSquares = numbers.reduce(into: [Int]()) { result, number inif number.isMultiple(of: 2) {result.append(number * number)}}// [4, 16]
reduce- это аналогfoldв других языках (Haskell, Kotlin, JavaScript). В Swift также естьreduce(into:)для мутабельных аккумуляторов, который эффективнее при работе со ссылочными типами.
Производительность: reduce имеет сложность O(n), где n - количество элементов. Для простых операций (сложение, умножение) он оптимален, но для сложных трансформаций с созданием новых объектов может быть менее эффективным, чем reduce(into:).
> Похожие задачи по mobile
Как посчитать количество уникальных значений в колонке DataFrame?
В чем разница между actors и менеджером памяти с пулом объектов в Swift?
В чем разница последовательной и параллельной очереди
Что будет выведено при вызове метода из экстеншена класса и протокола в Swift
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью