defer
关键字是Swift2推出的。swift
详细内容推荐看:bash
能够理解为在函数结束以前执行。async
为何说defer有点坑。函数
并非只有在func
里面才能使用。post
在各类if else
、try catch
中也能使用。ui
在一个做用域,好比func中,可以使用多个defer。spa
func() {
defer {
print("A")
}
defer {
print("B")
}
}
复制代码
执行方式是相似于栈,先进后入的方式,从后到前执行。3d
这里就是先输出B,再输出A。code
异步这个问题其实与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
复制代码