Swift Guard 守护
前言
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 守护的更多相关文章
- Swift - guard关键字(守护)
guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么.但与if语句不同的是,guard语句只会有一个代码块,不像if语句可以if else多个代码块. 那么guar ...
- Jexus进程守护工具jws.guard
一个运行中的进程,难免会因为各种各样的原因无缘无故的宕掉(比如网站瞬间的负载过高.内存不足等),而Jexus宕掉的后果往往只有一个:对外提供服务的网站无法访问了.因此,我们需要最大限度的保障我们的网站 ...
- Swift开发常用知识点
#pragma mark - as/类型转换as? / as! 需要根据前面的返回值决定 有?证明可选,可能为空:需要弱解包 没有?证明一定有值:大胆解包 as? 前面的结果是可选的 if let / ...
- python实现Linux启动守护进程
python实现Linux启动守护进程 DaemonClass.py代码: #/usr/bin/env python # -*- coding: utf-8 -*- import sys import ...
- swift3.0 运行时获取类的属性
//定义Person类 class Person: NSObject { var name: String? //注意这里基本数据类型我定义的是必选属性 var age: Int = override ...
- 初识iOS9 iPad新特性SlideView和SplitView的适配
苹果刚发布了iOS9,在iPad上新增了两个新的特性SlideView和SplitView,前者可以在不关闭当前激活APP的情况下调出来另外个APP以30%比例显示进行操作使用,后者允许同时运行两个A ...
- 手摸手教你让Laravel开发Api更得心应手
https://www.guaosi.com/2019/02/26/laravel-api-initialization-preparation/ 1. 起因 随着前后端完全分离,PHP也基本告别了v ...
- Swift基础--可选绑定和守护绑定
Swift中的可选绑定和守护绑定 1.可选绑定 格式 // 通过url来创建request对象 if let tempUrl = url { // url为可选类型,当可选类型有值,才执行大括号里面的 ...
- Swift的if let和guard let的使用 <一看就懂哟>
// // ViewController.swift // 可选项的判断 // // Created by 思 彭 on 16/9/16. // Copyright © 2016年 思 彭. All ...
随机推荐
- 线程池 多线程运行结束后 如何关闭? ExecutorService的正确关闭方法
前言 最近在使用ExecutorService的时候,对于与ExecutorService相关的概念有些迷糊, 加上本身ExecutorService内部的有些方法名在取名上也容易让使用者误解,导致 ...
- vtiger7菜单管理
添加了新模块,但是菜单上却没显示. 和菜单相关的表有4张 我们要把新建的message放到support模块下面 1.把默认的父级目录tools改成support 2. app2tab 0表示不显示, ...
- #14 [BZOJ2090/2089] [Poi2010]Monotonicity 2/Monotonicity
题解: 首先想到了标算..然后证明了一发是错的(事实证明很智障) 先说正确性比较显然的O(n^2)算法 令f[i][j]表示前i个物品,匹配到第j个括号,最大值是多少 g[i][j]表示前i个物品,匹 ...
- HDU - 1712 - ACboy needs your help 【分组背包】
<题目链接> 题目大意:有n个课程,现在花M天来学习这些课程,学习每个课程花的天数所得到的价值不同,求M天怎么分配学习才能得到的价值最大.(这些课程得到的价值和所花天数的关系由矩阵给出) ...
- springboot mail+Thymeleaf模板
compile 'org.springframework.boot:spring-boot-starter-thymeleaf' compile 'io.ratpack:ratpack-thymele ...
- 在webpack中使用postcss之插件cssnext
学习了precss插件包在webpack中的用法后,下面介绍postcss的另一个重要插件cssnext,步骤没有precss用法详细,主要介绍css4的语法,cssnext目前支持了部分新特性,你可 ...
- 利用django信号实现计数功能
本文主要知识点: 1.使用Django的signals来获取Model的新建/删除操作更新 2.使用数据库的select for update来正确处理并发的数据库操作 3.使用redis的sorte ...
- unity3d 给游戏添加音源 Unity3d adds a sound source to the game
unity3d 给游戏添加音源 Unity3d adds a sound source to the game 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:3131345 ...
- Windows7的MySQL数据库的安装
碰巧重装了系统,需要重新安装MySQL. 1.进入官网下载:https://dev.mysql.com/ 2.severonle 3.alt+n 4.alt+x
- [模板][P3808]AC自动机(简单版)
Description: 求n个模式串中有几个在文本串中出现 Solution: 模板,详见代码: #include<bits/stdc++.h> using namespace std; ...