2019-01-29
Swift defer 簡單解答
1. defer是什么?
The defer keyword provides a safe and easy way to handle this challenge by declaring a block that will be executed only when execution leaves the current scope.
翻譯一下
defer關(guān)鍵字提供了一個安全和簡便的方式來處理這件事,當(dāng)離開當(dāng)前的代碼塊時,會執(zhí)行defer對應(yīng)的代碼塊。
2. 定義一個方法
func openFileAction(){
///打開文件
openFile()
///讀文件
let isRead = readFile()
guard isRead else {
closeFile()
return
}
if emptyFile() {
closeFile()
return
}
print("讀取成功")
closeFile()
}
不建議這么做,不優(yōu)雅的做法,建議使用下面做法。如果執(zhí)行一個讀文件的操作,不管我們是否正確讀取到了文件內(nèi)容,我們都需要在執(zhí)行結(jié)束的時候,執(zhí)行關(guān)閉文件的操作,這樣關(guān)閉文件 closeFile() 方法的調(diào)用,在每次一個異常返回的地方都需要書寫,比較繁瑣而且容易忘寫。這時候我們就可以定義一個defer { closeFile() } ,然后把其他地方closeFile() 都刪掉,就完美實現(xiàn)了
func openFileAction(){
///打開文件
openFile()
defer{
closeFile()
}
///讀文件
let isRead = readFile()
guard isRead else {
return
}
if emptyFile() {
return
}
print("讀取成功")
}
代碼更少了,不用擔(dān)心漏過,其他開發(fā)者更容易理解和閱讀。
3. defer 作用域及使用誤區(qū)
func deferTest() {
let showDefer = true
if showDefer {
defer {
print("test")
}
}
var number = 0
number += 1
print("number 的值為 \(number)")
}
函數(shù)deferTest()執(zhí)行完畢的時候,不會輸出"test", 因為 在showDefer判斷語句這部分代碼塊執(zhí)行完畢的時候,defer的作用域就結(jié)束了,就會輸出“test”。
在defer外面附加作用域的時候,會影響defer的執(zhí)行作用域
4. Guard簡單講解
guard 當(dāng)條件滿足的時候,會順序執(zhí)行,如果guard條件不滿足的時候,會進入guard內(nèi)部,并執(zhí)行return操作,終止代碼的執(zhí)行。
guard 條件滿足 else {
return
}
繼續(xù)執(zhí)行下面的操作
4. Guard使用誤區(qū)
不要在guard后面的條件判斷中,執(zhí)行1層或者多層非操作
let str = ""
guard !str.isEmpty else {
return
}
繼續(xù)執(zhí)行
正確或者更優(yōu)雅的做法是: 不用guard,替換成if語句,執(zhí)行操作
let str = ""
if str.isEmpty{
return
}
繼續(xù)執(zhí)行