swift那些事儿 逃离闭包escaping

逃离闭包:当闭包作为一个参数给函数传递时,通常是在函数返回时调用的,如果需要在函数结束时调用闭包,则称为该闭包为逃离闭包用@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")
        })

 

 

 

 

 

你可能感兴趣的:(Swift)