Swift Academy · Lektion

some P (opaka resultattyper): dölja konkreta typer

Returnera some P för att dölja den konkreta returtypen samtidigt som ni garanterar att den följer P ; anropare får statisk typprestanda utan att implementationen exponeras.

Lektion 1 av 38 steg

some P (opaka resultattyper): dölja konkreta typer är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 1 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 ogenomskinliga resultattyper?

Ogenomskinliga resultattyper använder some P för att dölja en konkret typ bakom ett protokoll. Den konkreta typen är fast för funktionen, men anropande kod ser bara protokollets gränssnitt.

  • Inkapsling utan att förlora statisk prestanda
  • Utmärkt för fabriker och DSL-liknande API:er

Grundläggande ogenomskinlig fabrik

makeUnitCircle() returnerar some Shape. Anropande kod kan anropa area(), men kan inte förlita sig på den konkreta typen.

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 }
}

// Opaque factory: callers know it's a Shape, not which one
func makeUnitCircle() -> some Shape {
    Circle(r: 1.0)    // concrete type is hidden
}

let sh = makeUnitCircle()
print(String(format: "%.2f", sh.area()))  // 3.14

Fast per funktion

Den dolda typen är fast per funktion. En annan funktion som returnerar some Shape kan dölja en annan konkret typ.

// Each function using "some Shape" chooses one hidden concrete type.
// Within the same function, it must always be the same concrete type.
func makeSquare(side: Double) -> some Shape {
    Square(s: side)   // fixed to Square for this function
}

let a = makeUnitCircle()
let b = makeUnitCircle()
print(a.area() == b.area())  // true for two unit circles

let q = makeSquare(side: 2)
print(q.area())              // 4.0

Endast en dold typ

Regel: en funktion med en ogenomskinlig returtyp måste returnera samma konkreta typ längs alla exekveringsvägar. Olika grenar → kompileringsfel.

// ❌ This would NOT compile, because different branches return different concrete types:
// func makeShape(flag: Bool) -> some Shape {
//     if flag {
//         return Circle(r: 1)
//     } else {
//         return Square(s: 1) // error: underlying type must be the same
//     }
// }
// Rule: an opaque-returning function must always produce the same concrete type.

Ogenomskinliga typer med generiska typer

Ogenomskinliga returtyper kan kombineras med generiska typer. Anroparen ser en Shape, medan du håller implementationen Scaled<Circle> privat.

// A generic decorator that also conforms to Shape
struct Scaled<S: Shape>: Shape {
    let base: S
    let k: Double
    func area() -> Double { base.area() * k * k }
}

// Factory still hides the concrete generic type
func makeScaledUnitCircle(k: Double) -> some Shape {
    Scaled(base: Circle(r: 1.0), k: k)
}

let s1 = makeScaledUnitCircle(k: 2)
print(s1.area())  // 4 * π

När ska ogenomskinliga typer väljas?

Använd ogenomskinliga typer när:

  • Du vill dölja implementationen men behålla statisk typning.
  • API:er ska returnera en protokollvy (t.ex. Shape) utan att exponera konkreta typer.
  • Du bygger pipelines/DSL:er som kedjar byggare samtidigt som de förblir generiska.

(I nästa lektion jämför du med existentialtyper.)

Definition av ogenomskinlig resultattyp

Snabb kontroll: Vad garanterar some P?

Sammanfattning

Sammanfattning: Ogenomskinliga resultattyper (some P) döljer konkreta typer men behåller statisk dispatch. Den underliggande typen är fast per funktion; använd dem för rena, snabba och inkapslade API:er.

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 ”some P (opaka resultattyper): dölja konkreta typer” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”some P (opaka resultattyper): dölja konkreta typer”, 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 ”some P (opaka resultattyper): dölja konkreta typer”?

Returnera some P för att dölja den konkreta returtypen samtidigt som ni garanterar att den följer P ; anropare får statisk typprestanda utan att implementationen exponeras. 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 1 av 3.

Hur lång tid tar lektionen ”some P (opaka resultattyper): dölja konkreta typer”?

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