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)
执行步骤逐行解析:
- 初始化阶段:全局变量
x被赋值为5 - 第一次调用
increment()并将返回值赋值给x:- 进入函数执行到
return x,首先计算返回值:当前x为5,将5暂存为返回结果 - 函数即将退出,触发
defer块执行:x += 1,此时全局变量x被修改为6 - 函数返回暂存的5,将这个返回值赋值给全局变量
x,因此x的值从6被覆盖为5
- 进入函数执行到
- 第二次调用
increment()并将返回值赋值给result:- 进入函数执行到
return x,首先计算返回值:当前全局变量x为5,将5暂存为返回结果 - 函数即将退出,触发
defer块执行:x +=1,此时全局变量x被修改为6 - 函数返回暂存的5,将这个值赋值给常量
result,因此result最终值为5
- 进入函数执行到
- 执行
print(x, result, x):此时x为6、result为5,最终输出为6 5 6
内容的提问来源于stack exchange,提问作者Chr1s78
相关产品推荐
相关产品推荐

