博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift闭包3-逃逸闭包
阅读量:6646 次
发布时间:2019-06-25

本文共 1501 字,大约阅读时间需要 5 分钟。

原文链接:

引言

  本篇将介绍swift中一种特殊的闭包-逃逸闭包(escape closure)。

逃逸闭包

  当一个传入函数的闭包在函数执行结束之后才会被调用,这样的闭包就叫做逃逸闭包。如果一个函数的参数有一个逃逸闭包,可以在参数前加@escaping关键字来修饰。

  一个闭包是逃逸必要的条件是这个闭包需要存储在函数外部。举个例子,很多异步操作的函数往往会传入一个complete handler作为异步操作完成后的回调。当这个异步函数开始执行的时候,会开启一个异步操作,然后这个函数就直接结束了,此时,传入的闭包还没有被执行,实际上这个回调需要在异步操作完成后才会被执行。这种情况下这个回调的闭包需要定义成逃逸闭包,因为它在函数调用结束之后才会被执行。比如下面的例子:

var completionHandlers: [() -> Void] = []func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {    completionHandlers.append(completionHandler)}

someFunctionWithEscapingClosure以一个completionHandler作为参数,这个参数会被保存在函数外部的completionHandlers数组中,这时这个闭包是一个逃逸闭包,所以需要添加@escaping关键字去修饰,否则会有编译错误。

  逃逸闭包如果需要使用对象的变量或常量的时候,必须显示指明self,如果是普通的闭包,可以直接使用对象的变量或常量。比如下面的例子:

var completionHandlers: [() -> Void] = []func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {    completionHandlers.append(completionHandler)}func someFunctionWithNonescapingClosure(closure: () -> Void) {    closure()}class SomeClass {    var x = 10    func doSomething() {        someFunctionWithEscapingClosure { self.x = 100 }        someFunctionWithNonescapingClosure { x = 200 }    }}let instance = SomeClass()instance.doSomething()print(instance.x)// 输出 "200"completionHandlers.first?()print(instance.x)// 输出 "100"

在这个例子中,第一个print输出200,因为当调用doSomethig的时候,someFunctionWithNonescapingClosure会直接调用闭包{x = 200},此时instance.x变成200,当completionHandlers.first?()之后,someFunctionWithEscapingClosure传入的闭包才会真正执行,此时instance.x变成100.可以看到,逃逸闭包必须显示指明self,而普通的闭包可以直接使用x。

转载地址:http://ymrvo.baihongyu.com/

你可能感兴趣的文章
rsync+inotify配置笔记
查看>>
KVM虚拟机快照管理
查看>>
ANDROID解析JSON数据
查看>>
redhat系操作系统改yum源
查看>>
数据范围控制问题
查看>>
PHP中使用rolling cURL
查看>>
mysql基于amoeba的读写分离
查看>>
windows for循环 批量查找文件用winrar压缩并删除原文件
查看>>
开发技术讨论群
查看>>
solr查询索引
查看>>
谈谈对于vmware Workstation 网络连接三种模式的认识.
查看>>
捕食者物体跟踪算法:未来的计算机操作界面
查看>>
std::vector的数据头指针
查看>>
SCCM 2007系列6 软件播发
查看>>
Goroutine(协程)为何能处理大并发?
查看>>
igp总结之ospf
查看>>
python requests+lxml实现抓取网页静态内容中包含的图片
查看>>
AD RMS之Windows 内部数据库迁移到 SQL 服务器
查看>>
Exchange 2013 (一) 配置证书
查看>>
关于数组与指针的应用及区别-针对字符串去左边多余的‘0’字符
查看>>