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
複製代碼