前言

  • 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

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

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

Swift Guard 守护的更多相关文章

  1. Swift - guard关键字(守护)

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

  2. Jexus进程守护工具jws.guard

    一个运行中的进程,难免会因为各种各样的原因无缘无故的宕掉(比如网站瞬间的负载过高.内存不足等),而Jexus宕掉的后果往往只有一个:对外提供服务的网站无法访问了.因此,我们需要最大限度的保障我们的网站 ...

  3. Swift开发常用知识点

    #pragma mark - as/类型转换as? / as! 需要根据前面的返回值决定 有?证明可选,可能为空:需要弱解包 没有?证明一定有值:大胆解包 as? 前面的结果是可选的 if let / ...

  4. python实现Linux启动守护进程

    python实现Linux启动守护进程 DaemonClass.py代码: #/usr/bin/env python # -*- coding: utf-8 -*- import sys import ...

  5. swift3.0 运行时获取类的属性

    //定义Person类 class Person: NSObject { var name: String? //注意这里基本数据类型我定义的是必选属性 var age: Int = override ...

  6. 初识iOS9 iPad新特性SlideView和SplitView的适配

    苹果刚发布了iOS9,在iPad上新增了两个新的特性SlideView和SplitView,前者可以在不关闭当前激活APP的情况下调出来另外个APP以30%比例显示进行操作使用,后者允许同时运行两个A ...

  7. 手摸手教你让Laravel开发Api更得心应手

    https://www.guaosi.com/2019/02/26/laravel-api-initialization-preparation/ 1. 起因 随着前后端完全分离,PHP也基本告别了v ...

  8. Swift基础--可选绑定和守护绑定

    Swift中的可选绑定和守护绑定 1.可选绑定 格式 // 通过url来创建request对象 if let tempUrl = url { // url为可选类型,当可选类型有值,才执行大括号里面的 ...

  9. Swift的if let和guard let的使用 <一看就懂哟>

    // // ViewController.swift // 可选项的判断 // // Created by 思 彭 on 16/9/16. // Copyright © 2016年 思 彭. All ...

随机推荐

  1. URAL - 1078 Segments

    URAL - 1078 题目大意:有n条线段,一个线段a 完全覆盖另一个线段b 当且仅当,a.l < b.l && a.r>b.r.问你 一个线段覆盖一个线段再覆盖一个线段 ...

  2. python中的协程:greenlet和gevent

    python中的协程:greenlet和gevent 协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. 1.通过yield实现协程: 代码: import time def A(): ...

  3. BZOJ4990 [Usaco2017 Feb]Why Did the Cow Cross the Road II 动态规划 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4990 题意概括 有上下两行长度为 n 的数字序列 A 和序列 B,都是 1 到 n 的排列,若 a ...

  4. BZOJ1845 [Cqoi2005] 三角形面积并 扫描线 计算几何

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1845 题意概括 给出n个三角形,求其面积并. 题解 有一个很经典的扫描线题目:矩形面积并.那个比较 ...

  5. 【noip模拟赛7】足球比赛 树

    描述 在2009的中国城市足球比赛中,在2^N支队中,有一些队在开赛前宣布了退出比赛.比赛采取的是淘汰赛.比如有4支队伍参加,那么1队和2队比赛,3队和4队赛,然后1队和2队的胜者与3队和4队的胜者争 ...

  6. fork调用的底层实现

    fork调用的内核实现: http://www.cnblogs.com/huangwei/archive/2010/05/21/1740794.html http://blog.csdn.net/he ...

  7. css 选择器、元素默认宽度、media screen

    @media screen and (min-width:800px){ .a{  background: url('../image/banner/banner1.jpg') no-repeat l ...

  8. Linux学习之常用压缩命令(三)

    (一)常用压缩命令 (1)gzip命令 (2)gunzip命令 (3)tar命令 (4)zip命令 (5)unzip命令 (6)bzip2命令 (7)bunzip2命令 (一)常用压缩命令 (1)gz ...

  9. C# DataGridView搜索

    public static bool SearchDGV(DataGridView DGV, string strTxt, bool UpSearch = true, bool Show = fals ...

  10. Topcoder SRM590 Fox And City

    Problem Statement      There is a country with n cities, numbered 0 through n-1. City 0 is the capit ...