Rekurencyjne ograniczenia i generyka wyższego rzędu
Piszcie rekurencyjne ograniczenia (np. dla zagnieżdżonych sekwencji) oraz funkcje generyczne wyższego rzędu , które przyjmują generyczne closures/funkcje.
Rekurencyjne ograniczenia i generyka wyższego rzędu to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 3. 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 3 lekcji w sumie.
Co i dlaczego
W tej lekcji pokazano:
- Ograniczenia rekurencyjne: ograniczenia dotyczące zagnieżdżonych elementów generycznych (np. Sequence of Sequence).
- Generyki wyższego rzędu: funkcje generyczne przyjmujące generyczne domknięcia lub funkcje.
Zagnieżdżone sekwencje (spłaszczanie)
To klasyczny przykład ograniczenia rekurencyjnego: wymagamy, aby C.Element: Sequence, dzięki czemu możemy iterować na dwóch poziomach zagnieżdżenia.
// Works for any Collection whose elements are Sequences
func flatten<C: Collection>(_ c: C) -> [C.Element.Element]
where C.Element: Sequence {
var result: [C.Element.Element] = []
result.reserveCapacity(c.reduce(0) { $0 + ($1 as AnySequence<C.Element.Element>).underestimatedCount })
for inner in c {
for e in inner { result.append(e) }
}
return result
}
let nested = [[1,2], [3], [4,5]]
print(flatten(nested)) // [1,2,3,4,5]Generyczne mapowanie zagnieżdżonych struktur
Stosujemy dwa ograniczenia: C: Collection i C.Element: Collection, co pozwala wywołać map na każdym poziomie.
// Map over a two-level structure without fixing concrete types
func mapNested<C: Collection, R>(_ c: C, _ transform: (C.Element.Element) -> R) -> [[R]]
where C.Element: Collection {
return c.map { inner in inner.map(transform) }
}
let doubled = mapNested([[1,2],[3]], { $0 * 2 })
print(doubled) // [[2,4],[6]]compose(f,g)
Generyki wyższego rzędu: funkcja jest generyczna względem samych funkcji, co pozwala budować wielokrotnie używane potoki, takie jak compose.
// Compose two generic transforms that work on the same element type
func compose<A, B, C>(
_ f: @escaping (B) -> C,
_ g: @escaping (A) -> B
) -> (A) -> C {
{ a in f(g(a)) }
}
let toString: (Int) -> String = { "\\($0)" }
let length: (String) -> Int = { $0.count }
let intToLen = compose(length, toString)
print(intToLen(1234)) // 4Parametry generycznych domknięć
Domknięcie f również jest parametrem generycznym. Zachowujemy elastyczność typów dzięki ograniczeniom where.
// A generic "transform each" that accepts ANY transform (generic in T/U)
func transformEach<T, U, C: Collection>(_ c: C, using f: (T) -> U) -> [U]
where C.Element == T {
var out: [U] = []
out.reserveCapacity(c.count)
for x in c { out.append(f(x)) }
return out
}
let words = ["swift","kit"]
print(transformEach(words, using: { $0.uppercased() })) // ["SWIFT","KIT"]Wskazówki
Wskazówki:
- Stosuj najmniejsze potrzebne ograniczenia (
SequencezamiastCollection). - Dla czytelności preferuj klauzule where.
- Testuj rozwiązanie z wieloma konkretnymi typami, aby upewnić się, że jest ogólne.
- Dokumentuj założenia (np. dotyczące kolejności i unikatowości elementów).
Definicja generyków wyższego rzędu
Szybkie sprawdzenie: Co sprawia, że funkcja jest generyczną funkcją wyższego rzędu?
Podsumowanie
Podsumowanie: Używaj ograniczeń rekurencyjnych (np. C.Element: Sequence) do pracy z zagnieżdżonymi typami generycznymi; używaj generyków wyższego rzędu, aby w uporządkowany sposób tworzyć wielokrotnie używane potoki funkcji.
Często zadawane pytania
Czy lekcja „Rekurencyjne ograniczenia i generyka wyższego rzędu” jest bezpłatna?
Tak — pełny tekst „Rekurencyjne ograniczenia i generyka wyższego rzędu” 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 3 lekcji w sumie.
Co nauczysz się w „Rekurencyjne ograniczenia i generyka wyższego rzędu”?
Piszcie rekurencyjne ograniczenia (np. dla zagnieżdżonych sekwencji) oraz funkcje generyczne wyższego rzędu , które przyjmują generyczne closures/funkcje. Ć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 2 z 3.
Ile czasu zajmuje lekcja „Rekurencyjne ograniczenia i generyka wyższego rzędu”?
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
- Zgodności warunkowe
- Rekurencyjne ograniczenia i generyka wyższego rzędu
- Klauzule where w rozszerzeniach