0Pricing
Swift Academy · Lekcja

Wzorce erasure typów (AnySequence/AnyIterator)

Używajcie AnySequence i AnyIterator do ukrywania konkretnych typów sekwencji i iteratorów, aby API mogło zwracać „sekwencję elementów typu T” bez ujawniania implementacji.

Wzorce erasure typów (AnySequence/AnyIterator) 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.

Dlaczego wymazywanie typów?

Wymazywanie typów ukrywa konkretne typy za stabilnym opakowaniem. Dzięki AnySequence / AnyIterator można zwracać „sekwencję elementów” bez ujawniania struktury wewnętrznej.

Ograniczenie

Sequence ma typ skojarzony (Element), dlatego sam protokół nie może być używany jako konkretny typ wartości. Potrzebne jest opakowanie.

// Goal: return "some Sequence<Int>"
// This won't compile as a stored value type:
// let s: Sequence = [1,2,3]   // Protocol with associated types
// Instead, erase the type to AnySequence<Int>.

Opakowanie AnySequence

AnySequence opakowuje dowolną konkretną sekwencję (Array, Set lub własną) i udostępnia jednolity typ, taki jak AnySequence<Int>.

// Build an AnySequence<Int> from an Array
let a = [1, 2, 3]
let seq1: AnySequence<Int> = AnySequence(a)
// Consume like any sequence
for x in seq1 { print(x, terminator: " ") }
print("")

Opakowanie AnyIterator

AnyIterator opakowuje domknięcie, które generuje elementy. Należy opakować je w AnySequence, aby udostępnić pełną sekwencję.

// Create an AnyIterator<Int> by hand
var i = 0
let it = AnyIterator<Int> {
    // Return next number or nil to stop
    guard i < 3 else { return nil }
    defer { i += 1 }
    return i
}
let seq2 = AnySequence(it)
for x in seq2 { print(x, terminator: " ") }  // 0 1 2
print("")

Jednolity typ zwracany

Wymazywanie typów pozwala jednej funkcji zwracać różne implementacje pod jednym stabilnym typem zwracanym, takim jak AnySequence<Int>.

// Return a sequence of Int without exposing concrete type
func numbers(flag: Bool) -> AnySequence<Int> {
    if flag {
        // Array-based
        return AnySequence([10, 20, 30])
    } else {
        // Lazy generated with AnyIterator
        var n = 1
        let it = AnyIterator<Int> {
            guard n <= 3 else { return nil }
            defer { n += 1 }
            return n * 100
        }
        return AnySequence(it)
    }
}

for x in numbers(flag: true)  { print(x, terminator: " ") }  // 10 20 30
print("")
for x in numbers(flag: false) { print(x, terminator: " ") }  // 100 200 300
print("")

Kiedy go używać

Należy stosować type erasure, gdy:

  • Należy ukryć szczegóły implementacji sekwencji/iteratorów.
  • Interfejsy API muszą zwracać ten sam typ niezależnie od wewnętrznych gałęzi.
  • Generyki stają się zbyt widoczne na granicach API.

Uwagi: wewnątrz modułów należy preferować generyki ze względu na wydajność i czytelność; na granicach, gdy jest to potrzebne, należy używać AnySequence/AnyIterator.

Zastosowanie AnySequence

Szybkie sprawdzenie: Co daje AnySequence<T>?

Podsumowanie

Podsumowanie: Należy opakowywać konkretne sekwencje/iteratory za pomocą AnySequence / AnyIterator, aby wymazać typy i zwracać „sekwencję typu T” z elastycznych interfejsów API.

Często zadawane pytania

Czy lekcja „Wzorce erasure typów (AnySequence/AnyIterator)” jest bezpłatna?

Tak — pełny tekst „Wzorce erasure typów (AnySequence/AnyIterator)” 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 „Wzorce erasure typów (AnySequence/AnyIterator)”?

Używajcie AnySequence i AnyIterator do ukrywania konkretnych typów sekwencji i iteratorów, aby API mogło zwracać „sekwencję elementów typu T” bez ujawniania implementacji. Ć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 „Wzorce erasure typów (AnySequence/AnyIterator)”?

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. associatedtype i protocols generyczne
  2. Wzorce erasure typów (AnySequence/AnyIterator)
  3. Kiedy używać existential types (any P), a kiedy generics
← Powrót do Swift Academy