当闭包被作为参数传递给函数时,闭包被称为转义函数,但在函数返回后被调用。当你声明一个将闭包作为其参数的函数时,你可以在参数的类型之前写入@escaping来表示允许闭包被转义。

闭包可以逃脱的一种方式是存储在函数外部定义的变量中。作为例子,许多启动异步操作的函数都将闭包参数作为完成处理程序。该函数在开始操作后返回,但在操作完成之前不会调用闭包 - 闭包需要转义,稍后调用。例如:

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

someFunctionWithEscapingClosure(_ :)函数将闭包作为其参数,并将其添加到在函数外部声明的数组。如果你没有用@escaping标记这个函数的参数,你会得到一个编译时错误。

用@escaping标记闭包意味着你必须在闭包中明确地引用自己。例如,在下面的代码中,传递给someFunctionWithEscapingClosure(_ :)的闭包是一个转义闭包,这意味着它需要明确地引用自己。相比之下,传递给someFunctionWithNonescapingClosure(_ :)的闭包是一个非转义闭包,这意味着它可以隐式引用自己。

func someFunctionWithNonescapingClosure(closure: () -> Void) {closure()
}class SomeClass {var x = 10func doSomething() {someFunctionWithEscapingClosure { self.x = 100 }someFunctionWithNonescapingClosure { x = 200 }}
}let instance = SomeClass()
instance.doSomething()
print(instance.x)
// Prints "200"completionHandlers.first?()
print(instance.x)
// Prints "100"

Escaping Closures相关推荐

  1. SwiftUI 内功教程之Closures 11 Escaping Closures及经典用法

    SwiftUI 内功教程之Closures 11 Escaping Closures及经典用法 什么是闭包 闭包是独立的功能块,可以在代码中传递和使用.Swift中的闭包类似于C和Objective- ...

  2. Escaping Closures 两点

    1.block需要(拷贝)保存: 2.block引用的环境变量需要处理. 相当于oc中的copy block.

  3. Escaping closure captures non-escaping parameter ‘findPeripheral‘

    文章目录 1.问题 2.原因和解决 参考连接 1.问题 2.原因和解决 逃逸闭包前面没有加@escaping关键字,加上就可以了,如下图 参考连接 stack overflow 官方文档:Escapi ...

  4. Swift5.1 语言指南(九) 闭包

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  5. swift 通知_Swift 闭包无脑加 [weak self] 行不行?

    用到 Swift 的闭包的时候,我们经常会加 [weak self]. 但你有没有问过自己,它是不是非加不可? 比如这个场景: class YourViewController {override f ...

  6. oracle 快速关闭_快速关闭

    oracle 快速关闭 In this tutorial, we'll be discussing and seeing the usages (why, how and where) of Swif ...

  7. 闭包(Closures)

    闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似. 闭包可以捕获和存储其所 ...

  8. Swift 中的Closures(闭包)详解

    Swift 中的Closures(闭包)详解 在Swift没有发布之前,所有人使用OC语言编写Cocoa上的程序,而其中经常被人们讨论的其中之一 -- Block 一直备受大家的喜爱.在Swift中, ...

  9. C#和Java的闭包-Jon谈《The Beauty of Closures》

    第一段略... 大多数讲闭包的文章都是说函数式语言,因为它们往往对闭包的支持最完善.当你在使用函数式语言时,很可能已经清楚了解了什么是闭包,所以我想写一篇在经典OO语言出现的闭包有什么用处应该也是很合 ...

最新文章

  1. 「机器学习」彻底搞懂CNN
  2. 记录之tensorflow和pytorch中的取范数归一化操作
  3. 《Go语言圣经》学习笔记 第一章 Go语言入门
  4. Unity内实现Android APK版本更新
  5. spring5(6) ---Ioc和DI
  6. hive报错:Call from hostname/127.0.1.1 to localhost:9000 failed on connection exception.主节点9000端口拒绝访问.
  7. 2008北航计算机考研上机题,2006-2008北航计算机系考研真题(961).pdf
  8. Node.js下载安装及各种npm、cnpm、nvm、nrm配置(保姆式教程—提供全套安装包)—cnpm的安装与配置(3)
  9. javascript编辑器
  10. 网络链路不稳定的排查问题方法
  11. 嵌入式linux的驱动程序
  12. java glob paths_何时在JAVA的glob语法中使用**(双星)
  13. 9. Linux 磁盘与文件管理系统(inode 目录)
  14. 每天一道剑指offer-二叉搜索数的后序遍历序列
  15. python创建配置文件_python3 如何创建一个.ini的配置文件。
  16. 算法导论答案 16.2-4
  17. Java 调用SAP PI PO 的Rest JSON接口
  18. 遗传算法详解(GA)(个人觉得很形象,很适合初学者)
  19. Faceted project metadata file /.settings/org.eclipse.wst.common.project.facet.core.xml could
  20. 谷歌公司再出大招,Chrome 新版本发布

热门文章

  1. 使用frisby 进行post的表单信息的提交,以及nginx缓存的命中
  2. 第3章 Pytorch神经网络工具箱
  3. Dialog 弹框(几种常用弹框)
  4. 网络地址与主机地址的区别
  5. 基于JavaSSM+MySQL的健身网站前后台设计与实现
  6. 大数据架构建模群大咖研讨实录-20210426
  7. Acwing---1233. 全球变暖
  8. 智能信息处理复习1——布尔查询
  9. 深入了解存储器:快闪存储器介绍(上)
  10. 关系抽取—OneRel