Välja mellan some, any och generics
Välj generics för homogen statisk typning, some P för att dölja en fast konkret typ och any P för heterogen polymorfism.
Välja mellan some, any och generics är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 3 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.
När ska vilken variant användas?
Tumregel:
- Generiska typer: samma konkreta typ per anrop; bäst kontroll vid kompilering och bäst prestanda.
- some P: döljer den konkreta returtypen, som är fast per funktion.
- any P: blandar typer som uppfyller protokollet (heterogent) och använder dynamisk dispatch.
Generiska typer: homogena
Generiska typer är idealiska för homogena data och optimering (statisk dispatch, inlining).
protocol Shape { func area() -> Double }
struct Circle: Shape { let r: Double; func area() -> Double { .pi * r * r } }
struct Square: Shape { let s: Double; func area() -> Double { s * s } }
// Generic: one concrete Shape type per call site (homogeneous)
func totalAreaGeneric<S: Sequence, T: Shape>(_ xs: S) -> Double where S.Element == T {
xs.reduce(0) { $0 + $1.area() }
}
print(totalAreaGeneric([Circle(r:1), Circle(r:2)])) // OK
// totalAreaGeneric([Circle(r:1), Square(s:2)]) // ❌ different typesOgenomskinlig: dold men fast
some P returnerar en fast men dold typ. Det passar bra när du vill ha inkapsling utan att förlora statisk prestanda.
// Opaque factory hides the concrete type while guaranteeing Shape
func unitShape(flag: Bool) -> some Shape {
// Must return the SAME underlying type on all paths; pick one.
Circle(r: 1)
}
let s = unitShape(flag: true)
print(String(format: "%.2f", s.area())) // 3.14any P: heterogen
any P tillåter blandade typer i samma samling eller variabel; metoder anropas dynamiskt via protokollgränssnittet.
// Existential: store mixed conformers
let mixed: [any Shape] = [Circle(r: 1), Square(s: 2)]
let sum = mixed.reduce(0) { $0 + $1.area() } // dynamic dispatch
print(String(format: "%.2f", sum))Jämförelse av API-former
Välj gränssnitt:
- Generisk: anroparen styr den konkreta typen.
- Ogenomskinlig: du döljer typen, som är fast per funktion.
- Existential: de konkreta typerna kan variera dynamiskt.
// Three API shapes for the same idea: "make a Shape"
// 1) Generic return — exposes concrete type to caller
func makeGeneric<T: Shape>(_ t: T) -> T { t }
// 2) Opaque return — hides concrete type but fixed
func makeOpaqueCircle() -> some Shape { Circle(r: 1) }
// 3) Existential return — can return any conformer
func makeExistential(_ big: Bool) -> any Shape { big ? Square(s: 3) : Circle(r: 1) }
let g: Circle = makeGeneric(Circle(r: 2)) // caller knows concrete type
let o = makeOpaqueCircle() // caller sees only Shape
let e = makeExistential(true) // could be Circle or Square at runtime
print(g.area(), o.area(), e.area())Fusklapp
Riktlinjer:
- Föredra generiska typer för prestanda och stark typning när data är homogen.
- Använd some P för att dölja returtyper och hålla API:er stabila.
- Använd any P för plugin-liknande eller blandade samlingar.
- Undvik any P för protokoll med associerade typer/Self, om du inte använder typeliminering.
Beslutsfråga: välj some/any/generiska typer
Snabb kontroll: Vilket alternativ döljer en fast konkret returtyp bakom protokollet P?
Sammanfattning
Sammanfattning:
- Generiska typer = homogena, snabbast och mest statiska.
- some P = döljer den konkreta typen, fast per funktion.
- any P = heterogena och med dynamisk dispatch.
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 ”Välja mellan some, any och generics” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Välja mellan some, any och generics”, 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 ”Välja mellan some, any och generics”?
Välj generics för homogen statisk typning, some P för att dölja en fast konkret typ och any P för heterogen polymorfism. 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 3 av 3.
Hur lång tid tar lektionen ”Välja mellan some, any och generics”?
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
- some P (opaka resultattyper): dölja konkreta typer
- any P (existentiell): avvägningar och dynamisk dispatch
- Välja mellan some, any och generics