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
。
這里值得注意的是,id
和examNumber
可以在guard
語句之外使用,也就是說當guard
對其表達式進行驗證后,id
和examNumber
可在整個方法的作用域中使用,並且是解包后的。
我們再用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
實現的那么精准。而且id
和examNumber
的作用域只限在if
的第一個大括號內,超出這個作用域編譯就會報錯。