前言

  • 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. python全栈开发day14--内置函数和匿名函数

  2. Asp.Net Core 2.0 项目实战(4)ADO.NET操作数据库封装、 EF Core操作及实例

    Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...

  3. 用jQuery监听浏览器窗口的变化

    $(window).resize(function () { //当浏览器大小变化时 alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(docume ...

  4. 020 $.each的使用

    在工作中见到这个知识点,不是特别懂,就查了查资料,顺便整理一下 1.定义与用法 each() 方法规定为每个匹配元素规定运行的函数. 提示:返回 false 可用于及早停止循环. 语法 $(selec ...

  5. (转)python中调用R语言通过rpy2 进行交互安装配置详解

    python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753   python中调用R语言通过r ...

  6. .NET Core中使用Docker

    一.Docker简介 Docker是基于Linux容器技术(LXC),使用Go语言实现的开源项目,诞生于2013年,遵循Apache2.0协议.Docker自开源后,受到广泛的关注和讨论. Docke ...

  7. reactNative环境搭建+打包+部分报错总结

    个人搭建记录+个人收集: 多些真诚,少些坑. 排版书写过程可能不够详细,还望见谅. 详细见:http://files.cnblogs.com/files/chunlei36/reactNative%E ...

  8. HTTP那些事儿

    一.HTTP和HTTPSHTTP协议通常承载于TCP协议之上,在HTTP和TCP之间添加一个安全协议层(SSL或TSL),这个时候,就成了我们常说的HTTPS.HTTP是超文本传输协议,信息是明文传输 ...

  9. 一些日常工具集合(C++代码片段)

    一些日常工具集合(C++代码片段) ——工欲善其事,必先利其器 尽管不会松松松,但是至少维持一个比较小的常数还是比较好的 在此之前依然要保证算法的正确性以及代码的可写性 本文依然会持久更新,因为一次写 ...

  10. linux 关于时间日期date

    一.查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" ...