Swift - guard關鍵字(守護)


guard語句和if語句有點類似,都是根據其關鍵字之后的表達式的布爾值決定下一步執行什么。但與if語句不同的是,guard語句只會有一個代碼塊,不像if語句可以if else多個代碼塊。

那么guard語句的作用到底是什么呢?顧名思義,就是守護。guard語句判斷其后的表達式布爾值為false時,才會執行之后代碼塊里的代碼,如果為true,則跳過整個guard語句,我們舉例來看看。

我們以今年高考為例,在進入考場時一般都會檢查身份證和准考證,我們寫這樣一個方法:

func checkup(person: [String: String!]) {
  
    // 檢查身份證,如果身份證沒帶,則不能進入考場
    guard let id = person["id"] else {
        print("沒有身份證,不能進入考場!")
        return
    }
    
    // 檢查准考證,如果准考證沒帶,則不能進入考場
    guard let examNumber = person["examNumber"] else {
        print("沒有准考證,不能進入考場!")
        return
    }
    
    // 身份證和准考證齊全,方可進入考場
    print("您的身份證號為:\(id),准考證號為:\(examNumber)。請進入考場!")
    
}

checkup(["id": "123456"]) // 沒有准考證,不能進入考場!
checkup(["examNumber": "654321"]) // 沒有身份證,不能進入考場!
checkup(["id": "123456", "examNumber": "654321"]) // 您的身份證號為:123456,准考證號為:654321。請進入考場!

上述代碼中的第一個guard語句用於檢查身份證,如果檢查到身份證沒帶,也就是表達式為false時,執行大括號里的代碼,並返回。第二個guard語句則檢查准考證。

如果兩證齊全,則執行最后一個打印語句,上面的兩個guard語句大括號內的代碼都不會執行,因為他們表達式的布爾值都是true

這里值得注意的是,idexamNumber可以在guard語句之外使用,也就是說當guard對其表達式進行驗證后,idexamNumber可在整個方法的作用域中使用,並且是解包后的。

我們再用if else語句寫一個類似的方法:

func checkupUseIf(person: [String: String!]) {
    
    if let id = person["id"], let examNumber = person["examNumber"] {
        print("您的身份證號為:\(id),准考證號為:\(examNumber)。請進入考場!")
    } else {
        print("證件不齊全,不能進入考場!")
    }
    
    print("您的身份證號為:\(id),准考證號為:\(examNumber)")  // 報異常
    
}

checkupUseIf(["id": "123456"]) // 證件不齊全,不能進入考場!
checkupUseIf(["examNumber": "654321"]) // 證件不齊全,不能進入考場!
checkupUseIf(["id": "123456", "examNumber": "654321"]) // 您的身份證號為:123456,准考證號為:654321。請進入考場!

我們可以看到用if else實現的方法顯然不如guard實現的那么精准。而且idexamNumber的作用域只限在if的第一個大括號內,超出這個作用域編譯就會報錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM