美文网首页
swift defer关键字

swift defer关键字

作者: 晴川历历汉阳树丶 | 来源:发表于2020-08-25 10:50 被阅读0次

在测试中发现,defer的block运行的顺序永远在他所在的函数的 最后一个,也就是会在执行return的上一个执行。不管你把defer写到该函数的任何位置,他的block都会在return前一个执行。

    func deferTest() -> Int {
        
        print("deferTest-->",1)

        defer {
            print("deferTest-->",2)
        }

        print("deferTest-->",3)
          
        return 4
    }

输出结果
deferTest--> 1
deferTest--> 3
deferTest--> 2
deferTest--> 4

我们来换个位置再试一次

    func deferTest() -> Int {
        defer {
            print("deferTest-->",2)
        }

        print("deferTest-->",1)
        
        print("deferTest-->",3)

        return 4
    }

输出结果
deferTest--> 1
deferTest--> 3
deferTest--> 2
deferTest--> 4

哪怕这个函数有多个return,在执行任意一个return之前,都会运行defer的block,前提是defer关键字的那一行代码已经运行。

    func deferTest() -> Int {
        defer {
            print("deferTest-->",2)
        }

        print("deferTest-->",1)
        
        print("deferTest-->",3)
        
        if self.responds(to: #selector(test)) {
            return 4
        }else{
            return 5
        }
    }

输出结果
deferTest--> 1
deferTest--> 3
deferTest--> 2
deferTest--> 4

    func deferTest() -> Int {
        defer {
            print("deferTest-->",2)
        }

        print("deferTest-->",1)
        
        print("deferTest-->",3)
        
        //取反验证一下
        if !self.responds(to: #selector(test)) {
            return 4
        }else{
            return 5
        }
    }

输出结果
deferTest--> 1
deferTest--> 3
deferTest--> 2
deferTest--> 5

一个函数中有多个defer的时候,它是呈一个压栈状态的,也就是遵循后进先出的原则。

    func deferTest() -> Int {
        defer {
            print("deferTest-->",1)
        }
        
        defer {
            print("deferTest-->",2)
        }
        
        defer {
            print("deferTest-->",3)
        }
        
        print("deferTest-->",4)

        return 5
    }

输出结果
deferTest--> 4
deferTest--> 3
deferTest--> 2
deferTest--> 1
deferTest--> 5

defer的应用场景

因为新接触的关键词,实际当中运用到的情况并不是很多,还有待继续在开发中发现。

目前我只在对数据库事物进行处理的时候用到了。在操作数据库的读写的时候加了一个线程锁有好几次都是只上锁但是忘记解锁,导致在下一次对数据库进行操作的时候由于未解锁而无法操作,虽然问题不大,但是排查起来相当困难。所以我在函数中加了一个defer关键字,在其block中进行了lock.unlock()。果然有效解决了我的烦恼。

相关文章

  • swift  defer  关键字 推迟执行

    Swift defer 关键字 延迟执行

  • SwiftCafe 快报 - defer 关键字

    defer 关键字也是 Swift 2.0 中提供的新语法,就像是上期中我们提到的 guard 关键字一样。都是 ...

  • Swift - defer 关键字

    defer常用于数据库操作中的打开关闭或我们要执行某些必要操作流程时候defer会在该当前声明的作用域结束时候执行...

  • swift defer 关键字

    使用场景?在函数结束之后执行,一般用于资源释放 如何使用? 限制条件 参考:defer-usage-swift

  • swift defer关键字

    在测试中发现,defer的block运行的顺序永远在他所在的函数的 最后一个,也就是会在执行return的上一个执...

  • Swift 关键字 -- defer

    defer 用于在程序离开当前作用域之前,执行一段代码。 输出: 上诉在一个作用域内只有存在一个 defer 代码...

  • Swift defer

    Swift 关键字 defer 字面意思是推迟, 那什么时候执行呢? 在函数即将结束(return 之前). 具体...

  • Go语言defer关键字

    Go语言defer关键字 defer关键字用于延缓函数的执行 只需要在调用普通函数或方法前加上关键字defer,就...

  • Swift中一些常见的关键字二(if let,guard let

    在上一篇文章Swift中一些常见的关键字一(inout,defer,throw等)简单的介绍了几个关键字。本文续写...

  • Swift defer & guard

    2019-01-29Swift defer 简单解答 1. defer是什么? The defer keyword...

网友评论

      本文标题:swift defer关键字

      本文链接:https://www.haomeiwen.com/subject/qmpajktx.html