defer med feil og tidlige returer
Sørg for opprydding også ved feilkasting eller tidlig retur.
defer med feil og tidlige returer er en gratis leksjon i Swift Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Swift Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Swift Academy inneholder totalt 4 leksjoner.
defer kjøres ved return
En defer-blokk kjøres selv når funksjonen avsluttes tidlig via return.
func check(_ value: Int) {
defer { print("cleanup ran") }
if value < 0 {
print("negative, returning early")
return
}
print("value is", value)
}
check(-5)Opprydding på alle utførelsesstier
Uansett hvilken return som kjøres, utføres den utsatte oppryddingen nøyaktig én gang.
func classify(_ n: Int) {
defer { print("done classifying") }
if n == 0 { print("zero"); return }
if n > 0 { print("positive"); return }
print("negative")
}
classify(0)defer kjøres ved throw
Når en funksjon kaster en feil, kjøres registrerte defer-blokker fortsatt mens omfanget avvikles.
enum MyError: Error { case bad }
func risky(_ fail: Bool) throws {
defer { print("cleanup on the way out") }
if fail { throw MyError.bad }
print("no failure")
}
try? risky(true)Kombinere return og throw
Enten funksjonen returnerer normalt eller kaster en feil, kjøres den samme defer-blokken.
enum E: Error { case oops }
func op(_ flag: Bool) throws -> Int {
defer { print("op finishing") }
if flag { throw E.oops }
return 42
}
let r = try? op(false)
print(r ?? -1)Opprydding før feilen videreføres
Defer-blokken kjøres før feilen som ble kastet når kalleren, slik at ressursene frigjøres først.
enum E: Error { case fail }
func load(_ broken: Bool) throws {
print("open")
defer { print("close") }
if broken { throw E.fail }
print("read")
}
do {
try load(true)
} catch {
print("caught:", error)
}Bruke guard med defer
Et vanlig mønster er: anskaff ressursen, utsett oppryddingen med defer, og bruk deretter guard med tidlige returer som fortsatt utløser oppryddingen.
func process(_ items: [Int]) {
print("start")
defer { print("finished") }
guard !items.isEmpty else {
print("nothing to do")
return
}
print("processing", items.count, "items")
}
process([])defer og løkker med feil
En defer-blokk i en løkke kjøres på slutten av hver iterasjon, selv om en senere instruksjon kaster en feil.
enum E: Error { case stop }
func loop() throws {
for i in 1...3 {
defer { print("end", i) }
if i == 2 { throw E.stop }
print("body", i)
}
}
try? loop()Rekkefølge ved tidlig retur
Flere defer-blokker kjøres fortsatt i LIFO-rekkefølge ved en tidlig retur.
func multi(_ skip: Bool) {
defer { print("A") }
defer { print("B") }
if skip { return }
print("body")
}
multi(true)Loggføring ved feil
Bruk defer til å loggføre fullføring eller feil på en konsekvent måte på alle utførelsesstier.
enum E: Error { case bad }
func attempt(_ fail: Bool) throws {
var success = false
defer { print("attempt success:", success) }
if fail { throw E.bad }
success = true
}
try? attempt(true)Gjenopprette tilstand ved throw
defer egner seg godt til å rulle tilbake midlertidig tilstand når en operasjon kaster en feil.
enum E: Error { case fail }
func transaction(_ fail: Bool) throws {
var inProgress = true
defer { inProgress = false; print("inProgress:", inProgress) }
if fail { throw E.fail }
print("committed")
}
try? transaction(true)Beste praksis
Stol på defer for opprydding som må overleve tidlige returer og kastede feil, slik at ingen utførelsessti lekker ressurser.
enum E: Error { case x }
func safe(_ fail: Bool) throws {
print("acquire")
defer { print("release") }
if fail { throw E.x }
print("use")
}
try? safe(true)Hurtigsjekk
Test defer med feil og returer.
Oppsummering
defer kjøres hver gang et omfang avsluttes, også ved tidlig return og en kastet feil, før feilen videreføres. Derfor er defer et pålitelig sted for opprydding og gjenoppretting av tilstand på alle utførelsesstier, samtidig som LIFO-rekkefølgen bevares.
func f(_ skip: Bool) {
defer { print("cleanup") }
if skip { return }
print("work")
}
f(true)Lær deg Swift med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 122
- Leksjoner
- 409
Ofte stilte spørsmål
Er leksjonen «defer med feil og tidlige returer» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Swift Academy, inkludert «defer med feil og tidlige returer», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Swift Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «defer med feil og tidlige returer»?
Sørg for opprydding også ved feilkasting eller tidlig retur. Du øver på Swift Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Swift Academy?
Ingen tidligere erfaring er nødvendig. Swift Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «defer med feil og tidlige returer»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Swift Academy-leksjonen?
Ja. Alle Swift Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Slik fungerer defer
- Rekkefølge for flere defer-blokker
- defer for ressursopprydding
- defer med feil og tidlige returer