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