reduce и reduce(into:)
Объединяйте коллекции в одно значение.
«reduce и reduce(into:)» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Что такое свёртка
reduce сворачивает целую последовательность в одно значение, последовательно объединяя аккумулятор с каждым элементом.
- Вы задаёте начальное значение
- И замыкание
(accumulator, element) -> accumulator
Суммирование с помощью свёртки
Классический пример — сложить всё:
let nums = [1, 2, 3, 4]
let total = nums.reduce(0) { acc, x in acc + x }
print(total) // 10Сокращённая запись оператора
Если замыкание представляет собой только оператор, функцию оператора можно передать напрямую:
let nums = [1, 2, 3, 4]
print(nums.reduce(0, +)) // 10
print(nums.reduce(1, *)) // 24Свёртка с получением другого типа
Тип результата может отличаться от типа элементов:
let words = ["a", "b", "c"]
let joined = words.reduce("") { $0 + $1.uppercased() }
print(joined) // "ABC"Поиск максимума с помощью свёртки
С помощью свёртки можно вычислять не только суммы:
let nums = [3, 9, 2, 7]
let maxVal = nums.reduce(Int.min) { max($0, $1) }
print(maxVal) // 9Стоимость свёртки
Обычная reduce создаёт новый аккумулятор на каждом шаге. Для типов-значений, таких как String или Array, это означает копирование всего аккумулятора при обработке каждого элемента — для больших входных данных работа занимает O(n²).
Изменяемый вариант свёртки
reduce(into:) передаёт аккумулятор как параметр inout, поэтому Вы изменяете его на месте, не создавая копию:
let nums = [1, 2, 2, 3, 3, 3]
let counts = nums.reduce(into: [Int: Int]()) { dict, n in
dict[n, default: 0] += 1
}
print(counts) // [1: 1, 2: 2, 3: 3]Эффективное построение массива
Изменяемый вариант свёртки особенно эффективен при накоплении элементов в коллекции:
let nums = [1, 2, 3, 4, 5]
let evensSquared = nums.reduce(into: [Int]()) { result, n in
if n % 2 == 0 { result.append(n * n) }
}
print(evensSquared) // [4, 16]Свёртка с копированием и с изменением аккумулятора
Результат одинаковый, но характеристики производительности различаются:
let parts = ["a", "b", "c"]
let a = parts.reduce("") { $0 + $1 } // copies each step
let b = parts.reduce(into: "") { $0 += $1 } // mutates in place
print(a, b) // abc abcГруппировка с изменением аккумулятора
Распространённый шаблон: распределить элементы по группам с помощью ключа:
let names = ["Ann", "Al", "Bo", "Cy"]
let byInitial = names.reduce(into: [Character: [String]]()) { dict, name in
dict[name.first!, default: []].append(name)
}
print(byInitial[Character("A")]!) // ["Ann", "Al"]Какой вариант выбрать
Используйте reduce для недорогих скалярных аккумуляторов (целых чисел и чисел с плавающей точкой). Используйте reduce(into:), если аккумулятор является коллекцией или другим большим типом-значением, чтобы избежать копирования.
let nums = [1, 2, 3]
print(nums.reduce(0, +)) // scalar: plain reduce
print(nums.reduce(into: Set<Int>()) { $0.insert($1) }) // collection: intoБыстрая проверка
Почему при построении словаря или массива стоит предпочесть reduce(into:)?
Повторение
Вы изучили свёртку:
reduce(initial) { acc, x in ... }сворачивает последовательность в одно значение- Сокращённая запись оператора:
reduce(0, +) reduce(into:)изменяет аккумуляторinout— используйте его для коллекций- Отлично подходит для подсчёта, группировки и объединения
Далее: flatMap и объединение операций в цепочки.
Часто задаваемые вопросы
Урок «reduce и reduce(into:)» бесплатный?
Да — полный текст урока «reduce и reduce(into:)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «reduce и reduce(into:)»?
Объединяйте коллекции в одно значение. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «reduce и reduce(into:)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- map и compactMap
- filter и предикаты
- reduce и reduce(into:)
- flatMap и цепочки