0Pricing
Swift Academy · 课时

多个 defer 代码块的执行顺序

理解 defer 的逆序执行。

多个 defer 代码块的执行顺序 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

多个延迟执行

一个作用域可以包含多个 defer 代码块。它们都会在作用域退出时运行。

func demo() {
    defer { print("A") }
    defer { print("B") }
    print("body")
}
demo()

反向(LIFO)顺序

延迟执行的代码块会按照声明顺序的反向运行:最后声明的最先运行。

func order() {
    defer { print("1") }
    defer { print("2") }
    defer { print("3") }
    print("start")
}
order()

为什么采用 LIFO

LIFO 顺序与设置和清理的嵌套方式一致:最近进行的设置会最先撤销。

func resources() {
    print("open A")
    defer { print("close A") }
    print("open B")
    defer { print("close B") }
    print("use both")
}
resources()

栈式思维模型

请将延迟执行看作一个栈:每个延迟任务都会入栈,作用域结束时按相反顺序依次出栈。

func stack() {
    defer { print("pop first-declared last") }
    defer { print("pop last-declared first") }
    print("push done")
}
stack()

延迟执行与局部状态

每个延迟执行都会捕获周围的变量,并在运行时看到这些变量的最终值。

func state() {
    var x = 1
    defer { print("x is", x) }
    x = 42
}
state()

循环中的延迟执行

在循环中,每次迭代都会注册自己的延迟执行,并在该次迭代结束时按 LIFO 顺序运行。

for i in 1...2 {
    defer { print("late", i) }
    defer { print("early", i) }
    print("body", i)
}

嵌套作用域

延迟执行会在所属作用域退出时运行,因此内部代码块中的延迟执行会先于外部代码块中的运行。

func nested() {
    defer { print("outer defer") }
    do {
        defer { print("inner defer") }
        print("inner body")
    }
    print("outer body")
}
nested()

可预测的清理

LIFO 顺序意味着成对的打开和关闭操作会自然地按照正确顺序关闭。

func files() {
    print("open log")
    defer { print("flush log") }
    print("open db")
    defer { print("disconnect db") }
    print("transaction")
}
files()

读取执行顺序

要预测输出,请从下往上读取延迟执行:作用域中最后一个 defer 会最先输出。

func quiz() {
    defer { print("one") }
    defer { print("two") }
    print("body runs first")
}
quiz()

与返回结合使用

即使函数提前返回,所有已注册的延迟执行仍会按 LIFO 顺序运行。

func early(_ skip: Bool) {
    defer { print("cleanup 1") }
    defer { print("cleanup 2") }
    if skip { return }
    print("full body")
}
early(true)

最佳实践

在每次设置之后立即声明相应的清理代码,并依靠 LIFO 顺序正确地撤销这些设置。

func pattern() {
    print("acquire 1")
    defer { print("release 1") }
    print("acquire 2")
    defer { print("release 2") }
    print("work")
}
pattern()

快速检查

测试延迟执行的顺序。

回顾

多个 defer 代码块会在作用域退出时按反向(LIFO)顺序运行:最后声明的最先运行。即使提前返回,这也能自然地按照正确顺序撤销嵌套的设置与清理操作。

func demo() {
    defer { print("1") }
    defer { print("2") }
    print("body")
}
demo()

常见问题解答

「多个 defer 代码块的执行顺序」课时是免费的吗?

是的 — 「多个 defer 代码块的执行顺序」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「多个 defer 代码块的执行顺序」这节课中我会学到什么?

理解 defer 的逆序执行。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「多个 defer 代码块的执行顺序」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. defer 的工作原理
  2. 多个 defer 代码块的执行顺序
  3. 使用 defer 清理资源
  4. defer、错误与提前返回
← 返回 Swift Academy