我试图更准确地理解Swift的“关闭”。
但是@escaping
而且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}
self
保存在全局变量中的{self.x = 100}中如何completionHandlers
连接到instance
该对象SomeClass
?
其次,我这样理解someFunctionWithEscapingClosure
。
要将局部变量闭包存储completionHandler
到全局变量'completionHandlers we using
@ escaping`关键字!
没有@escaping
关键字someFunctionWithEscapingClosure
返回,局部变量completionHandler
将从内存中删除
@escaping
是将闭包保留在内存中
这是正确的吗?
最后,我只是想知道这种语法的存在。
也许这是一个非常基本的问题。
如果我们希望某些功能在某些特定功能之后执行。为什么我们不只在特定的函数调用之后才调用某些函数?
使用上面的模式和使用转义的回调函数有什么区别?