• 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的第一个大括号内,超出这个作用域编译就会报错。

  • 相关阅读:
    [转]资本经营董事长班告诉你:不只企业有商业模式,个人商业价值更重要
    [转]把人当成一个公司来经营,心就不会那么累
    [转]东方财智商学院告诉你如何写成功的商业计划书,按这23点来就好了
    [转]《穷爸爸富爸爸》作者破产了,他捧红了“财务自由”
    [转]人人店短信插件开发
    [转]简单的动态修改RDLC报表页边距和列宽的方法
    [转]程序员应打破牢笼,展望更高层次的世界
    jQuery validate and groups
    [转]C#利用反射实现两个类的对象之间相同属性的值的复制
    [转]ui-grid User can't select the row by clicking the select checkbox available in the respective row when enableFullRowSelection : true"
  • 原文地址:https://www.cnblogs.com/Rinpe/p/5221817.html
Copyright © 2020-2023  润新知