逃离闭包:当闭包作为一个参数给函数传递时,通常是在函数返回时调用的,如果需要在函数结束时调用闭包,则称为该闭包为逃离闭包用@escaping进行表明,通常情况下是非逃逸型闭包。
//声明一个数组,数组元素的类型是闭包
var closureArray:[()->Void] = []
//函数参数是逃离闭包类型的参数
func someFunctionWithEscapingClosure(ca:@escaping ()->Void){
//将闭包作为一个元素添加到数组中
closureArray.append(ca)
}
class SomeClass{
func doSometing(){
print("doSometing beging")
//函数中调用函数someFunctionWithEscapingClosure
someFunctionWithEscapingClosure{
//脱离闭包的生命
print("escaping closure begin")
}
//建立一个新的线程,执行closureArrayFirst函数
let myThread = Thread(target: self,
selector: #selector(closureArrayFirst),
object: nil)
//线程启动
myThread.start()
print("doSometing end")
}
@objc
func closureArrayFirst(){
print("myThread begin")
//执行数组中第一个元素(元素是闭包也就是函数即执行一个函数)
closureArray.first!()
}
}
let sc = SomeClass()
sc.doSometing()
执行结果:
doSometing beging
doSometing end
myThread begin
escaping closure begin
在函数结束后闭包才得以被执行。输出:escaping closure begin
其中的
someFunctionWithEscapingClosure{
//脱离闭包的生命
print("escaping closure begin")
}
是下记闭包的略写
someFunctionWithEscapingClosure(ca:{
() -> Void in print("escaping closure begin")
})