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的第一個大括號內,超出這個作用域編譯就會報錯。
