我试图更准确地理解 Swift 的“闭包”。
But @escaping
and Completion Handler
太难理解了
我查了很多Swift的帖子和官方文档,但感觉还是不够。
这是官方文档的代码示例
var completionHandlers: [()->Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping ()->Void){
completionHandlers.append(completionHandler)
}
func someFunctionWithNoneescapingClosure(closure: ()->Void){
closure()
}
class SomeClass{
var x:Int = 10
func doSomething(){
someFunctionWithEscapingClosure {
self.x = 100
//not excute yet
}
someFunctionWithNoneescapingClosure {
x = 200
}
}
}
let instance = SomeClass()
instance.doSomething()
print(instance.x)
completionHandlers.first?()
print(instance.x)
我听说有两种使用方法和原因@escaping
第一个是用于存储闭包,第二个是用于异步操作目的。
以下是我的问题:
首先,如果doSomething
然后执行someFunctionWithEscapingClosure
将使用闭包参数执行,并且该闭包将保存在全局变量数组中。
我认为闭包是 {self.x = 100}
How self
在保存在全局变量中的 {self.x = 100} 中completionHandlers
可以连接到instance
那个对象SomeClass
?
二、我的理解someFunctionWithEscapingClosure
像这样。
存储局部变量闭包completionHandler
到全局变量“完成处理程序”we using
@escaping`关键字!
without @escaping
关键词someFunctionWithEscapingClosure
返回,局部变量completionHandler
将从内存中删除
@escaping
就是将这个闭包保留在内存中
这是正确的吗?
最后,我只是想知道这个语法的存在。
也许这是一个非常初级的问题。
如果我们希望某个函数在某个特定函数之后执行。为什么我们不在特定函数调用之后调用某个函数呢?
使用上述模式和使用转义回调函数有什么区别?
Swift 完成处理程序转义和非转义:
假设用户在使用应用程序时正在更新它。你一定想要
完成后通知用户。您可能想弹出一个框
上面写着:“恭喜你,现在你可以尽情享受了!”
那么,如何仅在下载完成后运行一段代码呢?
完全的?此外,如何仅在
视图控制器已移至下一个?嗯,我们会发现
了解如何像老板一样设计一个。
根据我广泛的词汇表,完成处理程序代表
当事情完成后再做事情
Bob 的帖子清晰地介绍了完成处理程序(从开发人员的角度来看,它准确地定义了我们需要理解的内容)。
@转义闭包:
当在函数参数中传递闭包时,在函数体执行后使用它并返回编译器。当函数结束时,传递的闭包的范围存在并存在于内存中,直到闭包被执行。
有几种方法可以在包含函数中转义闭包:
当您尝试在这些场景中使用闭包时,Swift 编译器将显示错误:
为了更清楚地了解这个主题,您可以查看这篇文章发表在 Medium 上 https://medium.com/@kumarpramod017/what-do-mean-escaping-and-nonescaping-closures-in-swift-d404d721f39d.
再补充一点,每个 ios 开发者都需要理解:
-
逃离封闭:转义闭包是在传递给它的函数返回后调用的闭包。换句话说,
它比传递给它的函数寿命更长。
-
非逃逸闭包:在传入的函数内(即返回之前)调用的闭包。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)