在一些语言中,有try/finally这样的控制语句,比如Java。

这种语句可以让我们在finally代码块中执行必须要执行的代码,不管之前怎样的兴风作浪。

在Swift 2.0中,Apple提供了defer关键字,让我们可以实现同样的效果。

func checkSomething() {

    print("CheckPoint 1")
doSomething()
print("CheckPoint 4") } func doSomething() { print("CheckPoint 2")
defer {
print("Clean up here")
}
print("CheckPoint 3") } checkSomething() // CheckPoint 1, CheckPoint 2, CheckPoint 3, Clean up here, CheckPoint 4

上述示例可以看到,在打印出“CheckPoint 2”之后并没有打印出“Clean up here”,而是“CheckPoint 3”,这就是defer的作用,它对进行了print("Clean up here")延迟。我们再来看一个I/O的示例:

// 伪代码
func writeSomething() { let file = OpenFile() let ioStatus = fetchIOStatus()
guard ioStatus != "error" else {
return
}
file.write() closeFile(file) }

上述示例是一个I/O操作的伪代码,如果获取到的ioStatus正常,那么该方法没有问题,

如果ioStatus取到的是error,那么会被guard语句抓到执行return操作,

这样的话closeFile(file)就永远都不会执行了,一个严重的Bug就这样产生了。下面我们看看如何用defer来解决这个问题:

// 伪代码
func writeSomething() { let file = OpenFile()
defer {
closeFile(file)
} let ioStatus = fetchIOStatus()
guard ioStatus != "error" else {
return
}
file.write() }

我们将closeFile(file)放在defer代码块里,这样即使ioStatuserror,在执行return前会先执行defer里的代码,这样就保证了不管发生什么,最后都会将文件关闭。

需要注意的是, 虽然说defer的内容会在return之前执行, 但是如果defer定义在return之后, 那么还是不会执行defter的内容, 也就是说, defer关键字必须比return早出现。

放在return之后:

var str = "Hello, playground"

func show() {
print("这里是即将要推迟(但一定会)执行的代码")
} func test() { if str.characters.count >= 2 {
print("跳出该方法的执行")
return
} defer {
show()
}
} test() // 输出结果: 跳出该方法的执行

放在return之前:

var str = "Hello, playground"

func show() {
print("这里是即将要推迟(但一定会)执行的代码")
} func test() { defer {
show()
} if str.characters.count >= 2 {
print("跳出该方法的执行")
return
}
} test() // 输出结果: 跳出该方法的执行 这里是即将要推迟(但一定会)执行的代码

Swift - defer关键字(推迟执行)的更多相关文章

  1. 延宕执行,妙用无穷,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中defer关键字延迟调用机制使用EP17

    先行定义,延后执行.不得不佩服Go lang设计者天才的设计,事实上,defer关键字就相当于Python中的try{ ...}except{ ...}finally{...}结构设计中的finall ...

  2. Swift Defer 延迟调用

    1.Defer 在一些语言中,有 try/finally 这样的控制语句,比如 Java.这种语句可以让我们在 finally 代码块中执行必须要执行的代码,不管之前怎样的兴风作浪.在 Swift 2 ...

  3. go语言defer关键字背后的实现,语法,用法

    原文: https://tiancaiamao.gitbooks.io/go-internals/content/zh/03.4.html ------------------------------ ...

  4. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  5. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  6. 单表:SQL语句关键字的执行顺序

    表和数据: -- 创建表 CREATE TABLE `person` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, `age` ) ', ` ...

  7. MySQL数据库之单表查询中关键字的执行顺序

    目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...

  8. distinct关键字对执行计划的影响

    一.前言 最近看到一段话,"count(distinct 列名)若列上有索引,且有非空约束或在where子句中使用is not null,则会选择索引快速全扫描.其余情况则选择全表扫描&qu ...

  9. Go ---- defer 和 return 执行的先后顺序

    Go 中 defer 和 return 执行的先后顺序 多个defer的执行顺序为“后进先出”: defer.return.返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入 ...

随机推荐

  1. python3.5文档

    https://docs.python.org/3.5/tutorial/modules.html#packages

  2. 微信 回复多图文 借助php框架

    private function replyMostPhoto($data,$arr){$this->logger("已经到达回复多图文!".$arr[0]['Title'] ...

  3. 在 html 中用加色法混合颜色

    概要 本文通过解决一个假想的问题介绍了 css screen 混合模式,并介绍了如何用 svg 滤镜.canvas 2d.canvas webgl 实现相同的效果. 问题 下面的图片演示三种颜色光叠加 ...

  4. Ubuntu 12.04更换显示器后显示“显示不支援”,只能进恢复模式工作

    以前用的一台14寸液晶,换成17寸后,进入系统显示器上“显示不支援”  .仔细观查,电脑硬盘自检能显示后,后面都是黑屏. 解决过程. 因为grub 启动菜单不能显示.盲按方向键,发现菜单里的其它项目可 ...

  5. php计算剩余时间的自定义函数

    把两个日期格式的字符串转化成unix时间戳,然后相减获得时间戳差,最后判断剩余时间,生成类似(2小时30分钟20秒前发布)这样的时间格式,代码如下: function gettime($time_s, ...

  6. php的header()函数前有echo输出情况分析

    php的header()方法一般被用来告知浏览器做一些什么样的操作,比如跳转,刷新等等:而调用header方法前,如果使用echo输出一些内容,会发生什么情况呢?会对header函数有影响吗?我们实验 ...

  7. [Python笔记]第一篇:基础知识

    本篇主要内容有:什么是python.如何安装python.py解释器解释过程.字符集转换知识.传参.流程控制 初识Python 一.什么是Python Python是一种面向对象.解释型计算机程序设计 ...

  8. 学习微信小程序之css17clearfix原理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 2017-1-9css

    2017-1-9css css border-image详解 http://www.360doc.com/content/14/1016/13/2792772_417403574.shtml 最简单的 ...

  10. AudioServicesPlaySystemSound音频服务—b

    对于简单的.无混音音频,AVAudio ToolBox框架提供了一个简单的C语言风格的音频服务.你可以使用AudioservicesPlaySystemSound函数来播放简单的声音.要遵守以下几个规 ...