前言

  • 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. Linux环境下Node.js的安装配置

    1.   官网下载Node.js 2.   安装Node.js 根据下载内容的不同,提供三种安装方法,选择自己喜欢的方式 2.1.   绿色免安装版(Linux(.tar.gz)) 解压Node-XX ...

  2. Mybatis中的like模糊查询四种方式

    1.  参数中直接加入%% param.setUsername("%CD%"); param.setPassword("%11%"); <select i ...

  3. mongo3.x配置说明

    Mongodb 3.x配置说明,本文内容忽略了Enterprise版和一些不常用的配置. 一.配置说明 在Mongod安装包中,包含2个进程启动文件:mongod和mongos:其中mongd是核心基 ...

  4. python全栈开发day43-javascript

    一.昨日内容回顾 1.绝对定位的盒子居中 left:50%: margin-left:负的盒子宽度的一半 2.固定位置 脱离标准文档流 作用:返回顶部,广告,滚动监听栏.固定导航栏(body{marg ...

  5. 【Java】 剑指offer(22) 链表中倒数第k个结点

    正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的 ...

  6. 080 HBase的属性

    一:基本属性 1.查看属性 2.解释属性 NAME:列簇名 BLOOMFILTER:布隆过滤器,用于对storefile的过滤 共有三种类型: ROW:行健过滤 ROWCOL:行列过滤 NONE:无 ...

  7. 对于pycharm和vscode下,从外部复制文本内容为python字符串内容是会自动加\u202a解决办法

    先来看下这个python3源代码,表面上看没有语法毛病,如果源代码字符串内容是手动复制过来的文本内容,在pycharm和vscode下始终提示: pywintypes.error: (2, 'Shel ...

  8. poj2230 Watchcow【欧拉回路】【输出路径】(遍历所有边的两个方向)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4392 题目大意: 一个图,要将每条边恰好遍历两遍,而且要以不同的方向,还要回到原点. dfs解法    ...

  9. long long or int

    long long or int 很多时候long long爆空间,int有时又不够 . 在算乘法的时候,要保证乘出来的中间项也不爆long long

  10. Java内存管理-程序运行过程(一)

    勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine( ...