defer runs cleanup code when execution leaves the current scope.

Close work in one place

defer_cleanup.swift
func processTask(_ shouldFail: Bool) -> String {
    var steps: [String] = []
    steps.append("open")

    defer {
        steps.append("close")
        print(steps.joined(separator: ">"))
    }

    if shouldFail {
        steps.append("fail")
        return "failed"
    }

    steps.append("work")
    return "done"
}

let shouldFail = 
let outcome = processTask(shouldFail)

print(outcome)
func processTask(_ shouldFail: Bool) -> String {
    var steps: [String] = []
    steps.append("open")

    defer {
        steps.append("close")
        print(steps.joined(separator: ">"))
    }

    if shouldFail {
        steps.append("fail")
        return "failed"
    }

    steps.append("work")
    return "done"
}

let shouldFail = 
let outcome = processTask(shouldFail)

print(outcome)
defer A deferred block keeps cleanup near setup while still running after the main work path finishes.