- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第
Swift中转义闭包示例详解
目录前言转义与非转义闭包逃离方法将转义关闭付诸行动注意强参考周期内存泄漏背后的原因消除强引用循环概括
前言
Swift是一种非常强大的编程语言,是为Apple生态系统开发应用程序的首选;iOS、macOS、watchOS和tvOS。作为使用Swift编写代码的开发人员,我们经常使用闭包;语言的一个重要而重要的章节。
闭包不是初学者开始的主题。然而,这是每个人都必须尽快了解的东西。有很多方面需要了解并了解它们的工作原理。在所有这些中,有一个特定的;转义闭包和@escaping属性。在这篇文章中,我将尽可能简单地解释它们是什么以及它们可能带来的附带影响。
转义与非转义闭包
在谈论转义闭包时,我们总是指作为函数或方法参数提供的闭包。一般来说,我们将提供给方法(或函数)的闭包分为两类:
在方法执行完成之前调用的闭包。
在方法执行完成后调用的闭包。
在后一种情况下,我们谈论的是转义闭包;关闭该继续即使电子住后的的xecution方法,直到我们在以后的任何时间在未来给他们打电话。
在前一种情况下,与我上面描述的完全相反,我们称闭包为non-escaping。
直到Swift3,默认情况下,所有作为参数传递给方法或函数的闭包都被认为是转义的。自Swift3以来,这不再正确;默认情况下,所有方法都被认为是非转义的,这意味着它们在方法执行完成之前被调用。
以下代码部分演示了一个非转义闭包:
funcadd(num1:Double,
num2:Double,
completion:(_result:Double)-Void){
letsum=num1+num2
completion(sum)
所述completion封闭件之前执行代码叶调用的方法,所以这不是一个逸出闭合的情况。
然而,一个闭包是如何从一个方法中逃脱的,所以我们最终得到了与上述情况相反的结果?
逃离方法
为了使闭包成为转义闭包,有必要将对其的引用保留在方法的范围之外,以便我们稍后使用它。看看下面的代码:
classDemo{
varresult:Double
varresultHandler:(()-Void)
funcadd2(num1:Double,
num2:Double,
completion:()-Void){
resultHandler=completion
result=num1+num2
}
这里我们有一个result属性,它保存在方法内部发生的加法的结果。但我们也resultHandler有财产;this保持对completion作为方法参数提供的闭包的引用。
闭包通过以下行从方法中转义:
resultHandler=completion
然而,这不是唯一需要的操作,所以我们可以说这completion是一个转义闭包。我们必须明确指出编译器,否则我们将在Xcode中看到以下错误:
为了修复它,我们需要用@escaping属性标记闭包。我们将此属性放在闭包名称和分号之后,但在闭包类型之前,如下所示:
funcadd2(num1:Double,
num2:Double,
completion:@escaping()-Void){
...
编译器不再抱怨,completion现在正式成为转义闭包。
将转义关闭付诸行动
让我们在上面的Demo类中再添加两个方法;一个将调用add2(num1:num2:completion:)方法,另一个将调用resultHandler闭包以获得最终结果:
classDemo{
...
funcdoubleSum(num1:Double,
num2:Double){
add2(num1:num1,num2:num2){
guardletresult=self.resultelse{return}
self.result=result*2
}
}
funcgetResult(){
resultHandler()
}
第一种方法将add方法计算的结果加倍。但是,该结果不会翻倍,并且在add2(num1:num2:completion:)我们调用该getResult()方法之前,不会执行该方法中闭包主体内的代码。
这是我们从转义闭包中受益的地方;我们可以在我们的代码中需要的时候以及在合适的
文档评论(0)