Mønstre for typeerasure (AnySequence/AnyIterator)
Bruk AnySequence og AnyIterator til å skjule konkrete sequence-/iterator-typer, slik at API-er kan returnere «en sekvens av T» uten å eksponere implementasjonen.
Mønstre for typeerasure (AnySequence/AnyIterator) er en gratis leksjon i Swift Academy på CoddyKit. Dette er leksjon 2 av 3. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Swift Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Swift Academy inneholder totalt 3 leksjoner.
Hvorfor type-erasure?
Type-erasure skjuler konkrete typer bak en stabil wrapper. Med AnySequence / AnyIterator kan det returneres «en sekvens med elementer» uten å eksponere den interne strukturen.
Begrensningen
Sequence har en tilknyttet type (Element), så protokollen alene kan ikke brukes som en konkret verditype. Det trengs en wrapper.
// 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>.AnySequence-wrapper
AnySequence omslutter enhver konkret sekvens (Array, Set, egendefinert) og eksponerer en ensartet type som 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("")AnyIterator-wrapper
AnyIterator omslutter en closure som produserer elementer. Pakk den inn i AnySequence for å eksponere en fullstendig sekvens.
// 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("")Ensartet returtype
Type-erasure gjør det mulig for én funksjon å returnere ulike implementasjoner under én stabil returtype (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("")Når det bør brukes
Bruk type-erasure når:
- De vil skjule implementasjonsdetaljer for sekvenser/iteratorer.
- API-er må returnere samme type uavhengig av interne grener.
- Generics blir for eksponert ved API-grenser.
Merk: Foretrekk generics for ytelse og tydelighet internt i moduler; bruk AnySequence/AnyIterator ved grenser når det er nødvendig.
Formålet med AnySequence
Hurtigsjekk: Hva får De ut av AnySequence<T>?
Oppsummering
Oppsummering: Pakk inn konkrete sekvenser/iteratorer med AnySequence / AnyIterator for å viske ut typene og returnere «en sekvens av T» fra fleksible API-er.
Lær deg Swift med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 122
- Leksjoner
- 409
Ofte stilte spørsmål
Er leksjonen «Mønstre for typeerasure (AnySequence/AnyIterator)» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Swift Academy, inkludert «Mønstre for typeerasure (AnySequence/AnyIterator)», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Swift Academy inneholder totalt 3 leksjoner.
Hva lærer jeg i «Mønstre for typeerasure (AnySequence/AnyIterator)»?
Bruk AnySequence og AnyIterator til å skjule konkrete sequence-/iterator-typer, slik at API-er kan returnere «en sekvens av T» uten å eksponere implementasjonen. Du øver på Swift Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Swift Academy?
Ingen tidligere erfaring er nødvendig. Swift Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 3.
Hvor lang tid tar leksjonen «Mønstre for typeerasure (AnySequence/AnyIterator)»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Swift Academy-leksjonen?
Ja. Alle Swift Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- associatedtype og generiske protocols
- Mønstre for typeerasure (AnySequence/AnyIterator)
- Når bør existentials (any P) brukes kontra generics