我试图更准确地理解Swift 的"终结".
但是@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
有两种方法和理由
第一个用于存储闭包,第二个用于异步操作.
The following are my questions:
首先,如果doSomething
执行,那么someFunctionWithEscapingClosure
将使用闭包参数执行,并且闭包将保存在全局变量数组中.
我认为闭包是{self.x=100}
保存在全局变量completionHandlers
中的{self.x=self
}中的self
如何连接到SomeClass
的instance
对象?
第二,我理解这样的someFunctionWithEscapingClosure
.
将局部变量闭包completionHandler
存储到全局变量completionHandlerswe using
@escaping`关键词!
如果不返回@escaping
关键字someFunctionWithEscapingClosure
,局部变量completionHandler
将从内存中删除
@escaping
是在记忆中保留这个结尾
是这样吗?
最后,我只是想知道这种语法的存在.
也许这是一个非常基本的问题.
如果我们想在某个特定函数之后执行某个函数.为什么我们不在特定的函数调用之后调用某个函数呢?
使用上述模式和使用转义回调函数之间有什么区别?