美文网首页ios开发程序员IOS个人开发
SwiftCafe 快报 - defer 关键字

SwiftCafe 快报 - defer 关键字

作者: SwiftCafe | 来源:发表于2015-10-19 08:27 被阅读580次

    defer 关键字也是 Swift 2.0 中提供的新语法,就像是上期中我们提到的 guard 关键字一样。都是 Swift 2.0 中的现代化语言特性的体现。

    那么,我们现在就来看一下 defer 到底为何物。

    简单来说,defer 关键字指定了一个代码块,这个代码块中的代码,会在所在的作用域结束后被调用。这么说可能不太直观,用一个实际例子来说明吧。

    我们先来看这样一段数据库操作类似的代码:

    func dbOperation() -> Bool {
    
     let db = new Database()
    
     if db.open() {
    
       let rs = db.query("select count(*) from app where name='swift'")
    
       if rs.next() {
    
         if db.query("insert into app (name) values ('objc')") {
    
            db.close()
            return true
    
         } else {
    
           db.close()
           return false
    
         }
    
       } else {
    
         db.close()
         return false
    
       }
     } else {
    
       return false
    
     }
    
    }
    
    

    这个数据库操作函数,涉及到了资源的打开与关闭,我们这里的各个 if 分支,无论判断成功或者失败,都要在函数返回前释放数据库资源。这就是要实现这个逻辑需要的代码结构了。

    接下来,我们看看用 defer 关键字如何实现这个释放资源的逻辑:

    func dbOperation() -> Bool {
    
      let db = new Database()
    
    
    if db.open() {
    
       defer { 
         db.close() 
       }
    
       let rs = db.query("select count(*) from app where name='swift'")
    
       if rs.next() {
    
         if db.query("insert into app (name) values ('objc')") {
    
            return true
    
         } else {
    
           return false
    
         }
    
       } else {
    
         return false
    
       }
     } else {
    
       return false
    
     }
    
    }
    

    我们在成功调用 db.open() 方法后,立即声明了 defer 语句,并在其中调用了 db.close() 方法。defer 语句块中的代码不会立即被执行,而是会再我们这个函数退出后才会执行。这样就可以保证不论我们在哪个 if 分支退出函数,defer 中的语句,依然会被执行。而且 defer 语句的定义紧挨着 db.open() 这个资源申请语句,也大大增强了代码的可读性。

    不过,我们也看到,这么的多 if 分支,可读性依然不是太好,我们还可以再用 guard 关键字优化一下(关于 guard 关键字的介绍,可以参看这一期内容: SwiftCafe 快报 - guard 关键字语法):

    func dbOperation() -> Bool {
    
      let db = new Database()  
    
      guard db.open() else { return false }
    
       defer { 
         db.close() 
       }
    
      let rs = db.query("select count(*) from app where name='swift'")
    
      guard rs.next() else { return false }
    
      guard db.query("insert into app (name) values ('objc')")    else  { return false }
    
      return true
    }
    

    配合 guarddefer 关键字,其实减少了很多不必要的代码量,而且让我们的代码更加清晰可读,这也是 Swift 2.0 这次升级所引入的现代化开发思维所在。

    更多精彩内容可关注微信公众号:
    swift-cafe

    相关文章

      网友评论

        本文标题:SwiftCafe 快报 - defer 关键字

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