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) // 10Skró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, *)) // 24Redukcja 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) // 9Koszt 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 abcGrupowanie 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: intoSzybkie 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 akumulatorinout— 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
- map i compactMap
- filter i predykaty
- reduce i reduce(into:)
- flatMap i łańcuchy przekształceń