Swift Defer 延迟调用
1、Defer
在一些语言中,有
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")
} // CheckPoint 1, CheckPoint 2, CheckPoint 3, Clean up here, CheckPoint 4
checkSomething()
- 上述示例可以看到,在打印出
CheckPoint 2
之后并没有打印出Clean up here
,而是CheckPoint 3
,这就是defer
的作用,它对进行了print("Clean up here")
延迟。
- 上述示例可以看到,在打印出
在你的代码块就要结束前。如果你使用了
defer
。在其之中的代码就会运行。等于说,给了你最后的机会来进行一些处理。如果你熟悉 BDD 或者 TDD,那么你可以参考他们中的aferAll
机制。func myFunction() throws { defer { // No matter what happened I need do something
print("All done, clean up here")
} guard let item = item else { // need throws the error out
throw MyError.notExist
} guard item.count > maxNumber else { // need throws the error out
throw MyError.outOfRange
} // do something with item
// ...
}
如果你有多个
defer
语句,他们在执行的顺序会和栈一样,最后一个进,第一个出。
2、Defer 示例
我们再来看一个 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 就这样产生了。
- 上述示例是一个 I/O 操作的伪代码,如果获取到的
下面我们看看如何用
defer
来解决这个问题。func writeSomething() { let file = OpenFile() defer {
closeFile(file)
} let ioStatus = fetchIOStatus() guard ioStatus != "error" else {
return
} file.write()
}
- 我们将
closeFile(file)
放在defer
代码块里,这样即使ioStatus
为error
,在执行return
前会先执行defer
里的代码,这样就保证了不管发生什么,最后都会将文件关闭。
- 我们将
Swift Defer 延迟调用的更多相关文章
- defer 延迟调用
1. 延迟调用 defer 的用法很简单,只要在后面跟一个函数的调用,就能实现将这个 xxx 函数的调用延迟到当前函数执行完后再执行. defer xxx() 这是一个很简单的例子,可以很快帮助 ...
- go语言基础之defer延迟调用
1.defer作用 关键字 defer ⽤于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行.注意,defer语句只能出现在函数或方法的内部. 运行场景: defer语句经常被用于处理成对的操作 ...
- ReactiveSwift源码解析(十一) Atomic的代码实现以及其中的Defer延迟、Posix互斥锁、递归锁
本篇博客我们来聊一下ReactiveSwift中的原子性操作,在此内容上我们简单的聊一下Posix互斥锁以及递归锁的概念以及使用场景.然后再聊一下Atomic的代码实现.Atomic主要负责多线程下的 ...
- Twisted 延迟调用
延迟(defer)是twisted框架中实现异步的编程体系,使程序设计可以采用事件驱动的机制 1.基本使用 defer可以看作一个管理回调函数的对象,可以向该对象添加需要的回调函数同时也可以指定该组函 ...
- 17_defer(延迟调用)关键字的使用
1.defer是延迟调用关键字,只能在函数内部使用 2.总是在main函数结束前调用(和init用法相对) 3.如果有多个defer 遵循先进后出的原则 4.和匿名函数同时使用时,如果匿名函数带有参数 ...
- go 学习笔记之解读什么是defer延迟函数
Go 语言中有个 defer 关键字,常用于实现延迟函数来保证关键代码的最终执行,常言道: "未雨绸缪方可有备无患". 延迟函数就是这么一种机制,无论程序是正常返回还是异常报错,只 ...
- Go语言系列开发之延迟调用和作用域
Hello,各位小伙伴大家好,我是小栈君,最近一段时间我们将继续分享关于go语言基础系列,当然后期小栈君已经在筹划关于java.Python,数据分析.人工智能和大数据等相关系列文章.希望能和大家一起 ...
- go 学习笔记之咬文嚼字带你弄清楚 defer 延迟函数
温故知新不忘延迟基础 A "defer" statement invokes a function whose execution is deferred to the momen ...
- 【Unity3D】Invoke,InvokeRepeating ,Coroutine 延迟调用,周期性调用
Invoke和InvokeRepeating方法,可以实现延迟调用,和周期调用 第一个是执行一次,第二个是重复执行 void Invoke(string methodName, float time) ...
随机推荐
- [转] HTML5利用WebRTC的getUserMedia获取摄像头信息模拟拍照及视频(完整示例)
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...
- java 如何用pattern 和 Matcher 来使用正则表达式
java的regex库 java里预留了一个regex库,方便于我们在java里操作正则表达式,或者用它来匹配字符串. 其中比较常用的就是 Pattern 和 Matcher ,pattern是一个编 ...
- java中使用switch-case的用法及注意事项超全总结
http://m.blog.csdn.net/blog/tianyazaiheruan/8988420 今天陈红军老师在用到switch的时候,这种设计到最基本的内容,可能忘记它的一些基本语法,出现了 ...
- SQL server学习(四)T-SQL编程之事务、索引和视图
今天来分享下T-SQL高级编程中的事务.索引.视图,可以和之前的SQL server系列文章结合起来. 一.事务 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个 ...
- UltraEdit 不生成.bak文件
UE不自动生成.bak文件每次保存之后都能看到后面加个.bak后缀的文件出现有时真的很烦,而且还容易搞混,下面的方法可以解除这种烦恼.版本不同可以会有些差别. 中文版按照如下顺序设置:高级--> ...
- grpc ssl使用
相关链接 http://www.jianshu.com/p/2873a8349ca0
- 安卓工作室 android studio文件和代码模板,以及汉化出错问题
安卓工作室 android studio文件和代码模板,以及汉化出错问题 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313 ...
- BZOJ.3920.Yuuna的礼物(莫队 分块套分块 分段离散化)
题目链接 详细题解:https://www.cnblogs.com/autsky-jadek/p/4376091.html 代码参考自:https://www.cnblogs.com/Sakits/p ...
- restful开发API
http://blog.csdn.net/kkkloveyou/article/details/21391033 小示例http://blog.csdn.net/u011645059/article/ ...
- webstorm显示行号,结构预览
1,代码结构浏览menu>view>file structure popupwindwows>tool windws >structure (alt+7)代码结构当JS代码量很 ...