Swift2.1關鍵字 @noescape介紹


@noescape優化編譯器編譯,swift 2.1引入。

函數如果有一個一個參數是closure的話,可以在前面加一個關鍵字@noescape表示在函數return前closure生命周期結束,可以優化編譯。(closure 是引用類型, 可以引用到別的地方,如下:)

class A{
var b: (Void -> Void)!

func lalala(a: (Void->Void)){
self.b = a//引用到屬性b了
}
}

像上面的情況lalala的參數a是不能在前面標記@noescape

class A{    var b: (Void -> Void)!    func aa(@noescape a: (Void->Void)){        self.b = a//會報錯,報類型不一樣    }}

而沒有引用到外層的closure可以加@noescape例如

class A{    var b: (Void -> Void)!    func aa(@noescape a: (Void->Void)){        a()//不會報錯,這個不會再外部再次被調用    }}

@noescape 還有個特性就是標記了 @noescape的closure可以免去寫引用self。swift的普通closure使用self時都需要。這個可以例外。因為他相當於一個同步的調用,不會產生循環引用,所以不用特意強調self

class A{    var b: (Void -> Void)!    var k = 0//用來調用的    func aa(@noescape a: (Void->Void)){        a()    }    func bb(){        aa { () -> Void in            k = 1//一般的closure都是要self.k = 1,@noescape則不需要        }    }}

討論:啥時候會用到@noescape?現在很多函數式編程,比如有個排序,需要一個比較的closure作為參數,這種closure都會是同步調用完畢獲得返回值。這種可以放一個@noescape在前面,可優化內存,引用self不必寫self。其他的closure在外部引用着等待將來回掉用的則不能@noescape,因為它會escape。總體來說這個@noescape沒啥卵用,但是有些人會用,可能會嚇到你。比如我昨天就看到一個用了這個的,這個基本可以無視。蘋果文檔鏈接


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com