記一些defer關鍵字的小坑

簡介

defer關鍵字是Swift2推出的。swift

詳細內容推薦看:bash

swift 的 defer 幾個簡單的使用場景異步

能夠理解爲在函數結束以前執行。async

關鍵坑

爲何說defer有點坑。函數

使用場景

並非只有在func裏面才能使用。post

在各類if elsetry 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
複製代碼
相關文章
相關標籤/搜索