Swift Academy · Lektion

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.

Lektion 3 av 38 steg

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 types

Ogenomskinlig: 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.14

any 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.
Gratis att börja

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

  1. some P (opaka resultattyper): dölja konkreta typer
  2. any P (existentiell): avvägningar och dynamisk dispatch
  3. Välja mellan some, any och generics
← Tillbaka till Swift Academy