• Swift


    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

    这里值得注意的是,idexamNumber可以在guard语句之外使用,也就是说当guard对其表达式进行验证后,idexamNumber可在整个方法的作用域中使用,并且是解包后的。

    我们再用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实现的那么精准。而且idexamNumber的作用域只限在if的第一个大括号内,超出这个作用域编译就会报错。

  • 相关阅读:
    CodeForces Gym 100935G Board Game DFS
    CodeForces 493D Vasya and Chess 简单博弈
    CodeForces Gym 100935D Enormous Carpet 快速幂取模
    CodeForces Gym 100935E Pairs
    CodeForces Gym 100935C OCR (水
    CodeForces Gym 100935B Weird Cryptography
    HDU-敌兵布阵
    HDU-Minimum Inversion Number(最小逆序数)
    七月馒头
    非常可乐
  • 原文地址:https://www.cnblogs.com/Rinpe/p/5221817.html
Copyright © 2020-2023  润新知