Swift defer执行顺序
2018-05-13 本文已影响8人
FicowShen
根据以下实例代码进行探索总结:
var varToChange = 0
func testDefer(level:String) {
//作用域1整个函数是作用域
defer{
print("varToChange = \(varToChange)")
}
print("1-1")
varToChange = 1
if level == "2" {
//作用域2 if作用域
print("2--1")
defer {
print("2--2")
}
print("2--3")
}
print("1-2")
defer {
print("1-3")
}
print("1-4")
if level == "3" {
//作用域3 if作用域
print("3---1")
defer {
print("3---2")
}
print("3---3")
defer {
print("3---4")
}
}
print("1-5")
defer {
print("1-6")
}
}
testDefer(level: "") 的输出结果:
1-1
1-2
1-4
1-5
1-6
1-3
varToChange = 1
testDefer(level: "2") 的输出结果:
1-1
2--1
2--3
2--2
1-2
1-4
1-5
1-6
1-3
varToChange = 1
testDefer(level: "3") 的输出结果:
1-1
1-2
1-4
3---1
3---3
3---4
3---2
1-5
1-6
1-3
varToChange = 1
总结:
defer会在当前作用域(并不仅限于函数)结束时执行。
defer执行的顺序为逆序(栈式)。
defer中捕获的变量的值是可以进行变更的。