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
![]()