简介
defer关键字是Swift2推出的。
详细内容推荐看:
可以理解为在函数结束之前执行。
关键坑
为什么说defer有点坑。
使用场景
并不是只有在func里面才能使用。
在各种if else、try catch中也能使用。
执行顺序
在一个作用域,比如func中,能够使用多个defer。
func() {
defer {
print("A")
}
defer {
print("B")
}
}
执行方式是类似于栈,先进后入的方式,从后到前执行。
这里就是先输出B,再输出A。
异步
异步这个问题其实与defer关系并不大。
func test() -> String {
DispatchQueue.global(qos: .default).async {
for i in 0...10 {
print(i)
}
}
print("test")
return "return"
}
print(test())
在当前输出中,很多人都以为是print(i)与print("test")的顺序不确定,但return最后执行。
其实真实的输出:
test
0
1
2
3
4
5
return
6
7
8
9
10
return的执行顺序也是不确定的。
同理如果添加defer:
func test() -> String {
defer {
for i in 0...10 {
print("defer: \(i)")
}
}
DispatchQueue.global(qos: .default).async {
for i in 0...10 {
print(i)
}
}
print("test")
return "return"
}
结果:
test
0
1
2
3
4
5
6
defer: 0
7
8
defer: 1
9
defer: 2
10
defer: 3
defer: 4
defer: 5
defer: 6
defer: 7
defer: 8
defer: 9
defer: 10
return