记一些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
复制代码
相关文章
相关标签/搜索