0Pricing
Swift Academy · Lekcja

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))  // 4

Parametry 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 (Sequence zamiast Collection).
  • 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

  1. Zgodności warunkowe
  2. Rekurencyjne ograniczenia i generyka wyższego rzędu
  3. Klauzule where w rozszerzeniach
← Powrót do Swift Academy