0Pricing
Swift Academy · Lekcja

reduce i reduce(into:)

Agregowanie kolekcji do jednej wartości.

reduce i reduce(into:) to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Czym jest reduce

reduce sprowadza całą sekwencję do jednej wartości, wielokrotnie łącząc akumulator z kolejnym elementem.

  • Podaje się wartość początkową
  • Oraz closure (accumulator, element) -> accumulator

Sumowanie za pomocą reduce

Klasyczny przykład — dodawanie wszystkich elementów:

let nums = [1, 2, 3, 4]
let total = nums.reduce(0) { acc, x in acc + x }
print(total)  // 10

Skrót z użyciem operatora

Gdy closure jest po prostu operatorem, można bezpośrednio przekazać funkcję operatora:

let nums = [1, 2, 3, 4]
print(nums.reduce(0, +))   // 10
print(nums.reduce(1, *))   // 24

Redukcja do innego typu

Typ wyniku może różnić się od typu elementów:

let words = ["a", "b", "c"]
let joined = words.reduce("") { $0 + $1.uppercased() }
print(joined)  // "ABC"

Znajdowanie maksimum za pomocą reduce

Za pomocą reduce można obliczać agregaty inne niż sumy:

let nums = [3, 9, 2, 7]
let maxVal = nums.reduce(Int.min) { max($0, $1) }
print(maxVal)  // 9

Koszt reduce

Zwykłe reduce tworzy zupełnie nowy akumulator na każdym kroku. W przypadku typów wartości, takich jak String lub Array, oznacza to kopiowanie całego akumulatora przy każdym elemencie — dla dużych danych jest to praca rzędu O(n²).

Czas na reduce(into:)

reduce(into:) przekazuje akumulator jako parametr inout, dzięki czemu można modyfikować go w miejscu zamiast kopiować:

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]

Wydajne tworzenie tablicy

reduce(into:) świetnie sprawdza się podczas gromadzenia elementów w kolekcji:

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]

reduce a reduce(into:)

Ten sam wynik, ale inna charakterystyka wydajnościowa:

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

Grupowanie za pomocą reduce(into:)

Częsty wzorzec: przypisywanie elementów do grup według klucza:

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"]

Wybór odpowiedniej funkcji

W przypadku tanich akumulatorów skalarnych (Int, Double) należy używać reduce. Gdy akumulatorem jest kolekcja lub inny duży typ wartości, należy używać reduce(into:), aby uniknąć kopiowania.

let nums = [1, 2, 3]
print(nums.reduce(0, +))                          // scalar: plain reduce
print(nums.reduce(into: Set<Int>()) { $0.insert($1) }) // collection: into

Szybkie sprawdzenie

Dlaczego podczas tworzenia słownika lub tablicy warto preferować reduce(into:)?

Podsumowanie

W tej lekcji poznano redukcję:

  • reduce(initial) { acc, x in ... } sprowadza sekwencję do jednej wartości
  • Skrót z użyciem operatora: reduce(0, +)
  • reduce(into:) modyfikuje akumulator inout — należy używać go w przypadku kolekcji
  • Świetnie nadaje się do zliczania, grupowania i łączenia

Następnie: flatMap i łańcuchy operacji.

Często zadawane pytania

Czy lekcja „reduce i reduce(into:)” jest bezpłatna?

Tak — pełny tekst „reduce i reduce(into:)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „reduce i reduce(into:)”?

Agregowanie kolekcji do jednej wartości. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „reduce i reduce(into:)”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. map i compactMap
  2. filter i predykaty
  3. reduce i reduce(into:)
  4. flatMap i łańcuchy przekształceń
← Powrót do Swift Academy