逃逸閉包
func doWork(_block :()->()){
block()
}
//調(diào)用
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)//逃逸閉包中呻澜,強(qiáng)制加上swift
}
foo="bar"
}
func method3(){
doWorkAsync{
[weak self] in//這里沒有引用Self的實(shí)例引用
print(self?.foo??"為nil")
}
foo="bar"
}
}
S().method1()//輸出"foo"
S().method2()//輸出"bar"
S().method3()//這里輸出默認(rèn)值
//另外跨新,如果協(xié)議或者父類定義了一個接受@escaping為參數(shù)方法责静,那么在實(shí)現(xiàn)協(xié)議和類型的或者這個父類的子類中丈探,對應(yīng)的方法也必須被聲明為@escaping,否則兩個方法被認(rèn)為擁有不同的函數(shù)簽名