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
}
配合 guard
和 defer
关键字,其实减少了很多不必要的代码量,而且让我们的代码更加清晰可读,这也是 Swift 2.0
这次升级所引入的现代化开发思维所在。
更多精彩内容可关注微信公众号:
swift-cafe
网友评论