@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,否则两个方法被认为拥有不同的函数签名

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容