Mönster för typeliminering (AnySequence/AnyIterator)
Använd AnySequence och AnyIterator för att eliminera konkreta sekvens- och iteratortyper så att API:er kan returnera ”en sekvens av T” utan att exponera implementationen.
Mönster för typeliminering (AnySequence/AnyIterator) är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 2 av 3. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Swift Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Swift Academy innehåller totalt 3 lektioner.
Varför type erasure?
Type erasure döljer konkreta typer bakom en stabil wrapper. Med AnySequence / AnyIterator kan Ni returnera ”en sekvens av element” utan att exponera den interna strukturen.
Begränsningen
Sequence har en associerad typ (Element), så det fristående protokollet kan inte användas som en konkret värdetyp. Vi behöver 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 omsluter valfri konkret sekvens (Array, Set eller en egen) och exponerar en enhetlig typ 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 omsluter en closure som genererar element. Omslut den i AnySequence för att exponera en fullständig 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("")Enhetlig returtyp
Type erasure gör att en funktion kan returnera olika implementationer under en enda stabil returtyp (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 ska det användas
Använd type erasure när:
- Ni vill dölja implementeringsdetaljer för sekvenser eller iteratorer.
- API:er måste returnera samma typ oavsett interna grenar.
- Generics blir alltför exponerade vid API-gränser.
Obs! Föredra generics för prestanda och tydlighet i moduler; använd AnySequence/AnyIterator vid gränser när det behövs.
Syftet med AnySequence
Snabb kontroll: Vad får ni med AnySequence<T>?
Sammanfattning
Sammanfattning: Omslut konkreta sekvenser eller iteratorer med AnySequence / AnyIterator för att eliminera typer och returnera ”en sekvens av T” från flexibla API:er.
Lär dig Swift med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 122
- Lektioner
- 409
Vanliga frågor
Är lektionen ”Mönster för typeliminering (AnySequence/AnyIterator)” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Mönster för typeliminering (AnySequence/AnyIterator)”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Swift Academy innehåller totalt 3 lektioner.
Vad lär jag mig i ”Mönster för typeliminering (AnySequence/AnyIterator)”?
Använd AnySequence och AnyIterator för att eliminera konkreta sekvens- och iteratortyper så att API:er kan returnera ”en sekvens av T” utan att exponera implementationen. Ni övar på Swift Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Swift Academy?
Du behöver inga förkunskaper. Utbildningen i Swift Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 3.
Hur lång tid tar lektionen ”Mönster för typeliminering (AnySequence/AnyIterator)”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Swift Academy-lektionen?
Ja. Varje Swift Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- associatedtype och generiska protokoll
- Mönster för typeliminering (AnySequence/AnyIterator)
- När ska existentials (any P) användas i stället för generics