Autoclosures
Skjut upp utvärderingen av uttryck med @autoclosure.
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 bracesMed 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 condBevis 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 printsVar 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 printsLazy-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: boomAutoclosure 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 demandRenare 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)) // 99Autoclosures 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])) // 3Snabb kontroll
Vad gör @autoclosure med sitt argument?
Sammanfattning
Följande gäller för autoclosures:
@autoclosureomsluter 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
&&,||,??ochassert - Kombinera med
@escapingför att lagra; använd sparsamt för tydlighetens skull
Kursen är klar! Nästa steg: Equatable, Hashable och Comparable.
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.