多个 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 反馈 — 无需本地设置。
此课程中的所有课时
- defer 的工作原理
- 多个 defer 代码块的执行顺序
- 使用 defer 清理资源
- defer、错误与提前返回