@escaping 逃逸闭包

逃逸闭包

func doWork(_block :()->()){

block()

}

//调用

doWork{

print("work")

}

func doWorkAsync(_block:@escaping()->()){

DispatchQueue.main.async{

block()

}

}

doWorkAsync{

print("doWorkAsync")

}

classS{

var foo ="foo"

func method1(){

doWork{

print(foo)

}

foo="bar"

}

func method2(){

doWorkAsync{

print(self.foo)//逃逸闭包中,强制加上swift

}

foo="bar"

}

func method3(){

doWorkAsync{

[weak self] in//这里没有引用Self的实例引用

print(self?.foo??"为nil")

}

foo="bar"

}

}

S().method1()//输出"foo"

S().method2()//输出"bar"

S().method3()//这里输出默认值

//另外,如果协议或者父类定义了一个接受@escaping为参数方法,那么在实现协议和类型的或者这个父类的子类中,对应的方法也必须被声明为@escaping,否则两个方法被认为拥有不同的函数签名

你可能感兴趣的:(@escaping 逃逸闭包)