前言

  • 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。

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

  • 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 实现的那么精准,而且 id 和 examNumber 的作用域只限在 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. ORA-01427: 单行子查询返回多个行

    有人问题我一个问题,情况如下:他要用根据divide_act_channel_day的new_amount字段去更新divide_stat的new_amount字段.两张表关联的条件:day=log_ ...

  2. Codeforces Round #392 (Div. 2)-D. Ability To Convert

    D - Ability To Convert 题目大意:给你一个数字 n 接下来再输入一个数字 w(<10^60),表示w这个数字是 n 进制的, 并且超过十进制也用数字表示,这样就有多种组合了 ...

  3. HDU 6114 Chess【逆元+组合数】(组合数模板题)

    <题目链接> 题目大意: 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子.一天,小度在棋盘上摆起了许多車……他想知道,在一共N×M个点的矩形棋盘中摆最多个数的車使 ...

  4. 爬虫之Resquests模块的使用(二)

    Requests Requests模块 Requests模块是一个用于网络访问的模块,其实类似的模块有很多,比如urllib,urllib2,httplib,httplib2,他们基本都提供相似的功能 ...

  5. 附002.Docker常见命令

    # docker --help Usage: docker [OPTIONS] COMMAND [arg...] docker daemon [ --help | ... ] docker [ -h ...

  6. SQL 查询存储过程

    select distinct name from syscomments a,sysobjects b where a.id=b.id and b.xtype='p' --and text like ...

  7. 50 tips of JavaScript,这些坑你都知道吗?

    1.在局部作用域中,使用var操作符定义的变量将成为定义该变量的作用域中的局部变量,省略var的会创建全局变量:在全局作用域中,不管是否使用var操作符定义的变量都会创建一个全局变量.但是,在全局作用 ...

  8. 11.5 正睿停课训练 Day16

    目录 2018.11.5 正睿停课训练 Day16 A 道路规划(思路) B 逻辑判断(枚举 位运算/DP 高维前缀和) C 区间(贪心/树状数组) 考试代码 A B C 2018.11.5 正睿停课 ...

  9. unity DoTween使用

    先说插件获取,DoTween是一个开源的插件,它的代码托管在Github上[https://github.com/Demigiant/dotween].若只是单纯项目需要是可以去AssetStore获 ...

  10. linux系统下shell命令中的sleep

    在有的shell(比如linux中的bash)中sleep还支持睡眠(分,小时)sleep 1    睡眠1秒sleep 1s    睡眠1秒sleep 1m   睡眠1分sleep 1h   睡眠1 ...