Swift闭包3-逃逸闭包

Swift闭包3-逃逸闭包,第1张

概述原文链接:http://1199game.com/2016/10/S... 引言   本篇将介绍swift中一种特殊的闭包-逃逸闭包(escape closure)。 逃逸闭包   当一个传入函数的闭包在函数执行结束之后才会被调用,这样的闭包就叫做逃逸闭包。如果一个函数的参数有一个逃逸闭包,可以在参数前加@escaping关键字来修饰。   一个闭包是逃逸必要的条件是这个闭包需要存储在函数外部。举

原文链接:http://1199game.com/2016/10/S...

引言

  本篇将介绍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。

总结

以上是内存溢出为你收集整理的Swift闭包3-逃逸闭包全部内容,希望文章能够帮你解决Swift闭包3-逃逸闭包所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1071260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存