前言
guard
语句和if
语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么。guard
语句只会有一个代码块,不像if
语句可以if else
多个代码块。guard
必须强制有else
语句。guard
中的else
只能执行转换语句,像return
,break
,continue
或者throws
,当然你也可以在这里返回一个函数或者方法。
guard
语句的作用顾名思义就是守护。guard
语句判断其后的表达式布尔值为false
时,才会执行之后代码块里的代码,如果为true
,则跳过整个guard
语句。
1、guard 语句示例
1)我们以高考为例,在进入考场时一般都会检查身份证和准考证,我们写这样一个方法。
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(person: ["id": "123456"]) // 没有准考证,不能进入考场! checkup(person: ["examNumber": "654321"]) // 没有身份证,不能进入考场! checkup(person: ["id": "123456", "examNumber": "654321"]) // 您的身份证号为:123456,准考证号为:654321。请进入考场!
上述代码中的第一个
guard
语句用于检查身份证,如果检查到身份证没带,也就是表达式为nil
时,执行大括号里的代码,并返回。第二个guard
语句则检查准考证,如果两证齐全,则执行最后一个打印语句,上面的两个guard
语句大括号内的代码都不会执行,因为他们表达式的布尔值都是非nil
。这里值得注意的是,
id
和examNumber
可以在guard
语句之外使用,也就是说当guard
对其表达式进行验证后,id
和examNumber
可在整个方法的作用域中使用,并且是解包后的。
2)我们再用
if else
语句写一个类似的方法。func checkup(person: [String: String]) { if let id = person["id"], let examNumber = person["examNumber"] { print("您的身份证号为:\(id),准考证号为:\(examNumber)。请进入考场!") } else { print("证件不齐全,不能进入考场!") } //print("您的身份证号为:\(id),准考证号为:\(examNumber)") // 报异常 }
checkup(person: ["id": "123456"]) // 证件不齐全,不能进入考场! checkup(person: ["examNumber": "654321"]) // 证件不齐全,不能进入考场! checkup(person: ["id": "123456", "examNumber": "654321"]) // 您的身份证号为:123456,准考证号为:654321。请进入考场!
- 可以看到用
if else
实现的方法显然不如guard
实现的那么精准,而且id
和examNumber
的作用域只限在if
的第一个大括号内,超出这个作用域编译就会报错。
- 可以看到用