guard语句
guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么。但与if语句不同的是,guard语句只会有一个代码块,不像if语句可以if else多个代码块。
那么guard语句的作用到底是什么呢?顾名思义,就是守护。guard语句判断其后的表达式布尔值为false时,才会执行之后代码块里的代码,如果为true,则跳过整个guard语句,我们举例来看看。
我们以今年高考为例,在进入考场时一般都会检查身份证和准考证,我们写这样一个方法:
1
2
3
4
5
6
7
@H_404_32@
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
funccheckup(person:[String:String!]){
//检查身份证,如果身份证没带,则不能进入考场
guardletid=person[
"id"
]
else
{
print(
"没有身份证,不能进入考场!"
)
return
}
//检查准考证,如果准考证没带,则不能进入考场
guardletexamNumber=person[
"examNumber"
{
"没有准考证,不能进入考场!"
)
return
}
//身份证和准考证齐全,方可进入考场
"您的身份证号为:\(id),准考证号为:\(examNumber)。请进入考场!"
)
}
checkup([
:
"123456"
])
//没有准考证,不能进入考场!
"654321"
//没有身份证,不能进入考场!
,
//您的身份证号为:123456,准考证号为:654321。请进入考场!
|
上述代码中的第一个guard语句用于检查身份证,如果检查到身份证没带,也就是表达式为false时,执行大括号里的代码,并返回。第二个guard语句则检查准考证。
如果两证齐全,则执行最后一个打印语句,上面的两个guard语句大括号内的代码都不会执行,因为他们表达式的布尔值都是true。
这里值得注意的是,id和examNumber可以在guard语句之外使用,也就是说当guard对其表达式进行验证后,id和examNumber可在整个方法的作用域中使用,并且是解包后的。
我们再用if else语句写一个类似的方法:
funccheckupUseIf(person:[String:String!]){
if
letid=person[
],letexamNumber=person[
]{
"您的身份证号为:\(id),准考证号为:\(examNumber)。请进入考场!"
)
}
{
"证件不齐全,不能进入考场!"
)
"您的身份证号为:\(id),准考证号为:\(examNumber)"
)
//报异常
}
checkupUseIf([
//证件不齐全,不能进入考场!
//证件不齐全,不能进入考场!
我们可以看到用if else实现的方法显然不如guard实现的那么精准。而且id和examNumber的作用域只限在if的第一个大括号内,超出这个作用域编译就会报错。
|