记一些defer关键字的小坑

855 阅读1分钟

简介

defer关键字是Swift2推出的。

详细内容推荐看:

swift 的 defer 几个简单的使用场景

可以理解为在函数结束之前执行。

关键坑

为什么说defer有点坑。

使用场景

并不是只有在func里面才能使用。

在各种if elsetry 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