You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift defer语句执行逻辑:为何示例代码中result值为5?

Swift defer语句执行规则与运行结果说明

核心执行规则

Swift中defer语句的行为遵循以下固定逻辑:

  • defer 代码块不会在声明时执行,只会在它所在的作用域(函数、闭包、循环、条件分支等)即将退出前的最后一刻触发执行
  • 函数中遇到return语句时,执行顺序严格分为三步:
    • 计算return后面的表达式的值,将这个值暂存为函数的最终返回结果
    • 执行当前作用域内所有已注册的defer代码块(多个defer按先进后出的顺序执行)
    • 函数正式退出,将第一步暂存的返回值返回给调用方
  • 对于值类型的返回值,第一步暂存的是值的副本,后续defer块对原变量的修改不会影响已经暂存的返回结果

对应代码逐流程拆解

原代码如下:

var x = 5
func increment() -> Int {
    defer { x += 1 }
    return x
}

x = increment()
let result = increment()
print(x, result, x)

执行步骤逐行解析:

  1. 初始化阶段:全局变量x被赋值为5
  2. 第一次调用increment()并将返回值赋值给x:
    • 进入函数执行到return x,首先计算返回值:当前x为5,将5暂存为返回结果
    • 函数即将退出,触发defer块执行:x += 1,此时全局变量x被修改为6
    • 函数返回暂存的5,将这个返回值赋值给全局变量x,因此x的值从6被覆盖为5
  3. 第二次调用increment()并将返回值赋值给result:
    • 进入函数执行到return x,首先计算返回值:当前全局变量x为5,将5暂存为返回结果
    • 函数即将退出,触发defer块执行:x +=1,此时全局变量x被修改为6
    • 函数返回暂存的5,将这个值赋值给常量result,因此result最终值为5
  4. 执行print(x, result, x):此时x为6、result为5,最终输出为6 5 6

内容的提问来源于stack exchange,提问作者Chr1s78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:24:16