Swift defer & guard

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í)行
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,953評論 0 9
  • 如何搭建一個vue項目 一、安裝node環(huán)境 1、下載地址為:https://nodejs.org/en/ 2、檢...
    毛尖哥閱讀 360評論 0 0
  • 層巒疊嶂霧徘徊,雁陣逶迤次第開。 旭日初升山色近,天光云影映璇臺。 (平水韻·十灰)
    不惑而歌閱讀 1,732評論 8 41
  • 去年四月時,跑步偶爾路過多摩川的櫻花步道,雖然已經(jīng)過了滿開的季節(jié),但樹上依然零星地掛著搖搖欲墜的花朵。當(dāng)時想著,明...
    Annessu閱讀 547評論 0 6

友情鏈接更多精彩內(nèi)容