Swift Academy · Lektion

Autoclosures

Skjut upp utvärderingen av uttryck med @autoclosure.

Lektion 4 av 413 steg

Autoclosures är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 4 av 4. 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 4 lektioner.

Vad är en autoclosure?

@autoclosure omsluter automatiskt ett argumentuttryck i en closure, så att det inte utvärderas förrän funktionen faktiskt använder det. Anroparen skriver ett vanligt uttryck, inte en closure.

Utan autoclosure

Normalt kräver fördröjd utvärdering en explicit closure vid anropsstället:

func logIf(_ cond: Bool, _ message: () -> String) {
    if cond { print(message()) }
}
logIf(true) { "expensive" }  // caller writes braces

Med autoclosure

@autoclosure gör att anroparen kan skicka ett vanligt uttryck:

func logIf(_ cond: Bool, _ message: @autoclosure () -> String) {
    if cond { print(message()) }
}
logIf(true, "expensive")  // no braces, evaluated only if cond

Bevis på fördröjd utvärdering

Uttrycket körs först när closure-funktionen anropas:

func pick(_ cond: Bool, _ value: @autoclosure () -> Int) -> Int {
    cond ? value() : -1
}
func costly() -> Int { print("computed"); return 42 }
print(pick(false, costly()))  // -1  -- "computed" never prints

Var standardbiblioteket använder det

Operatorerna && och ||, assert samt ?? använder alla autoclosures, så att högerledet utvärderas endast vid behov.

Kortslutning som med ??

En egen funktion för standardvärden som hoppar över reservvärdet när det inte behövs:

func orElse<T>(_ value: T?, _ fallback: @autoclosure () -> T) -> T {
    value ?? fallback()
}
func makeDefault() -> Int { print("built"); return 0 }
print(orElse(5, makeDefault()))  // 5  -- "built" never prints

Lazy-meddelanden i assert-stil

Bygg meddelandet endast när kontrollen misslyckas:

func check(_ cond: Bool, _ msg: @autoclosure () -> String) {
    if !cond { print("FAIL: \(msg())") }
}
check(true, "this is never built")
check(false, "boom")  // FAIL: boom

Autoclosure plus escaping

Kombinera med @escaping för att lagra det fördröjda uttrycket till senare:

var thunks: [() -> Int] = []
func defer2(_ expr: @autoclosure @escaping () -> Int) {
    thunks.append(expr)
}
defer2(1 + 1)
print(thunks[0]())  // 2  -- computed on demand

Renare läsning vid anropsstället

Fördelen är enbart syntaktisk: anroparen skriver ett värde, medan funktionen får en closure:

func unless(_ cond: Bool, _ value: @autoclosure () -> String) -> String {
    cond ? "skipped" : value()
}
print(unless(false, "shown"))  // "shown"

När det INTE bör användas

Autoclosures döljer att ett argument är en closure, vilket kan överraska läsaren. Använd dem sparsamt — endast när fördröjd utvärdering verkligen hjälper, till exempel för att undvika kostsamma standardvärden.

func first<T>(_ a: T?, _ b: @autoclosure () -> T) -> T { a ?? b() }
print(first(nil, 99))  // 99

Autoclosures tar inga argument

En autoclosure har alltid formen () -> T — den omsluter ett enda uttryck och kan inte ta parametrar:

func once(_ make: @autoclosure () -> [Int]) -> Int {
    make().count
}
print(once([1, 2, 3]))  // 3

Snabb kontroll

Vad gör @autoclosure med sitt argument?

Sammanfattning

Följande gäller för autoclosures:

  • @autoclosure omsluter ett argumentuttryck i en closure av typen () -> T
  • Uttrycket körs först när funktionen anropar det — fördröjd utvärdering
  • Det används av &&, ||, ?? och assert
  • Kombinera med @escaping för att lagra; använd sparsamt för tydlighetens skull

Kursen är klar! Nästa steg: Equatable, Hashable och Comparable.

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 ”Autoclosures” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Autoclosures”, 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 4 lektioner.

Vad lär jag mig i ”Autoclosures”?

Skjut upp utvärderingen av uttryck med @autoclosure. 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 4 av 4.

Hur lång tid tar lektionen ”Autoclosures”?

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. Fånga värden via referens
  2. Escaping closures
  3. Capture lists och weak self
  4. Autoclosures
← Tillbaka till Swift Academy