Swift Academy · Lektion

defer med fel och tidiga returer

Säkerställ städning även vid throwing eller tidig retur.

Lektion 4 av 413 steg

defer med fel och tidiga returer ä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.

defer körs vid return

Ett defer-block körs även när funktionen avslutas tidigt via return.

func check(_ value: Int) {
    defer { print("cleanup ran") }
    if value < 0 {
        print("negative, returning early")
        return
    }
    print("value is", value)
}
check(-5)

Upprensning på varje kodväg

Oavsett vilket return som körs utförs den uppskjutna upprensningen exakt en gång.

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 körs vid throw

När en funktion kastar ett fel körs registrerade defer-block fortfarande medan scopet avvecklas.

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)

Kombinera return och throw

Oavsett om funktionen returnerar normalt eller kastar ett fel körs samma defer-block.

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)

Upprensning innan felet sprids

Defer-blocket körs innan det kastade felet når anroparen, så resurserna frigörs 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)
}

guard med defer

Ett vanligt mönster är att förvärva en resurs, skjuta upp upprensningen med defer och sedan använda guard med tidiga returer som fortfarande utlöser upprensningen.

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 och loopar som kastar fel

Ett defer inuti en loop körs i slutet av varje iteration, även om en senare sats kastar ett fel.

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()

Ordning vid tidig retur

Flera defer-block körs fortfarande i LIFO-ordning vid en tidig retur.

func multi(_ skip: Bool) {
    defer { print("A") }
    defer { print("B") }
    if skip { return }
    print("body")
}
multi(true)

Loggning vid fel

Använd defer för att konsekvent logga slutförande eller fel på alla kodvägar som avslutar funktionen.

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)

Återställa tillstånd vid throw

defer passar utmärkt för att återställa tillfälligt tillstånd när en operation kastar ett fel.

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)

Bästa praxis

Förlita dig på defer för upprensning som måste överleva tidiga returer och kastade fel, så att ingen kodväg läcker resurser.

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)

Snabbkontroll

Testa defer med fel och returer.

Sammanfattning

defer körs när scopet avslutas, även vid en tidig return eller ett kastat fel, och körs innan felet sprids vidare. Därför är det en tillförlitlig plats för upprensning och återställning av tillstånd på alla kodvägar, samtidigt som LIFO-ordningen bevaras.

func f(_ skip: Bool) {
    defer { print("cleanup") }
    if skip { return }
    print("work")
}
f(true)
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 ”defer med fel och tidiga returer” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”defer med fel och tidiga returer”, 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 ”defer med fel och tidiga returer”?

Säkerställ städning även vid throwing eller tidig retur. 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 ”defer med fel och tidiga returer”?

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. Så fungerar defer
  2. Ordning för flera defer-block
  3. defer för resursstädning
  4. defer med fel och tidiga returer
← Tillbaka till Swift Academy