最佳答案
我试图更准确地理解斯威夫特的“终结”。
但是 @escaping
和 Completion Handler
太难理解了
我搜索了很多斯威夫特的帖子和官方文件,但我觉得还是不够。
这是官方文档的代码示例
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}
保存在全局变量 completionHandlers
中的{ self. x = 100}中的 self
如何连接到 SomeClass
的对象 instance
?
第二,我是这样理解 someFunctionWithEscapingClosure
的。
将局部变量闭包 completionHandler
存储为全局变量‘ CompletionHandlerswe using
@escape’关键字!
如果没有 @escaping
关键字 someFunctionWithEscapingClosure
返回,局部变量 completionHandler
将从内存中删除
@escaping
是将这个闭包保留在内存中
是这样吗?
最后,我想知道这种语法是否存在。
也许这是一个非常基本的问题。
如果我们想要某个函数在某个特定函数之后执行。我们为什么不在特定的函数调用之后调用某个函数呢?
使用上面的模式和使用转义回调函数有什么区别?