升級(jí)到Swift3.0后,需要明確指出逃逸閉包绒瘦,可以幫助編譯器進(jìn)行優(yōu)化
逃逸閉包:可以逃離出所在函數(shù)執(zhí)行的
非逃逸閉包:在函數(shù)中執(zhí)行的
舉個(gè)例子膊毁,異步的網(wǎng)絡(luò)請(qǐng)求的回調(diào)是一個(gè)逃逸閉包
func asyncNetworkRequest(url:String, handler:((_ result:String) -> ())) {
// 以下偽代碼示意
HttpClient.Get(url, handler)
}
如代碼中閉包handler就是一個(gè)逃逸閉包精堕,當(dāng)其他其他代碼調(diào)用asyncNetworkRequest函數(shù)的時(shí)候凸克,執(zhí)行完HttpClient.Get后會(huì)立即返回议蟆,此時(shí)網(wǎng)絡(luò)請(qǐng)求可能甚至還沒有真正發(fā)出。直至若干時(shí)間后請(qǐng)求應(yīng)答返回后触徐,才會(huì)由HttpClient再調(diào)用handler從而執(zhí)行閉包咪鲜。
再舉個(gè)例子,排序sort中可以傳遞的閉包是一個(gè)非逃逸閉包
array.sort(by: {$0 > $1}
其中的閉包{$0 > $1}會(huì)在sort這個(gè)函數(shù)執(zhí)行過程中使用撞鹉,用來比較元素的大小。