swift_038(Swift之guard关键字(守护))

Swift - guard关键字(守护)

guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么。但与if语句不同的是,guard语句只会有一个代码块,不像if语句可以if else多个代码块。

那么guard语句的作用到底是什么呢?顾名思义,就是守护。guard语句判断其后的表达式布尔值为false时,才会执行之后代码块里的代码,如果为true,则跳过整个guard语句,我们举例来看看。

我们以今年高考为例,在进入考场时一般都会检查身份证和准考证,我们写这样一个方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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语句写一个类似的方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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的第一个大括号内,超出这个作用域编译就会报错。


我们举一个电影院检票的例子:
//票务
struct Ticket
{
    var movieName:String//该场电影名字
    var TimeValid:Bool = true//电影票有效
}

func checkTicket(ticket:Ticket?,currentMovieName:String)
{

    guard let _ = ticket,ticket?.movieName == currentMovieName else {

        print("非此场电影")
        return
    }
    guard ticket?.TimeValid else {

        print("该票已过期")
        return
    }

    //TODO:
    print("可以看电影了")

}

Swift:这些情况下 guard 要慎用

Tip 1  不要用 guard —— 作为 if 的相反情况时

Tip 2  不要用 guard —— 不要在 guard 的 else 语句中放入复杂代码

Tip 3  不要用 guard —— 不要用 guard 去代替一些比较复杂的 if else 语句

最后提醒一点: 在使用 guard 的时候,请确保自己已经对可选链有一个正确的了解,guard 可以帮助我们避免使用显示的 if let 进行解包。

参考:(http://www.cocoachina.com/swift/20160908/17509.html





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值