【发布时间】:2018-02-24 23:55:45
【问题描述】:
我正在尝试更准确地理解 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}
保存在全局变量completionHandlers 中的{self.x = 100} 中的self 如何连接到instance 的SomeClass 对象?
其次,我是这样理解someFunctionWithEscapingClosure的。
将局部变量闭包completionHandler存储到全局变量'completionHandlerswe using@escaping`关键字!
没有@escaping关键字someFunctionWithEscapingClosure返回,局部变量completionHandler将从内存中删除
@escaping 将闭包保存在内存中
是这样吗?
最后,我只是想知道这个语法的存在。
也许这是一个非常初级的问题。
如果我们希望某个函数在某个特定函数之后执行。为什么我们不在一个特定的函数调用之后调用某个函数呢?
使用上述模式和使用转义回调函数有什么区别?
【问题讨论】: