0Pricing
Swift Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. map и compactMap
  2. filter и предикаты
  3. reduce и reduce(into:)
  4. flatMap и цепочки
← Назад к Swift Academy