SwiftCafe 快报 - defer 关键字

SwiftCafe 快报 - defer 关键字_第1张图片

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 关键字)