一、閉包
1.as!
:作用是類型轉(zhuǎn)換
2.CustomStringConvertible
和CustomDebugStringConvertible
CustomStringConvertible 和CustomDebugStringConvertible這兩個(gè)協(xié)議類似于Objective-C中的重寫description方法,繼承協(xié)議 實(shí)現(xiàn)description 和 debugDescription 屬性 即可打印出想要的數(shù)據(jù)內(nèi)容。
-
閉包作為函數(shù)參數(shù)傳遞時(shí),可以省略返回值類型
,具體表現(xiàn)在代碼寫法上, 省略參數(shù)列表
和關(guān)鍵字in
//1.標(biāo)準(zhǔn)格式
BubbleSort(array: &stuArr, sortClosure:{(i, nextI) ->Bool in
return (i as! Student).achievement > (nextI as! Student).achievement
})
//2.省略返回值類型
BubbleSort(array: &stuArr, sortClosure:{(i, nextI) in
return (i as! Student).achievement > (nextI as! Student).achievement
})
//3.使用默認(rèn)生成的參數(shù)名,(格式:$0,$1,$2...), 可以省略參數(shù)列表和閉包關(guān)鍵字in
BubbleSort(array: &stuArr, sortClosure:{
return ($0 as! Student).achievement > ($1 as! Student).achievement
})
推薦使用第3種高級(jí)寫法
4.省略關(guān)鍵字return
如果閉包由一行代碼組成,return關(guān)鍵字也可以省略览芳,默認(rèn)會(huì)將此行代碼執(zhí)行結(jié)果返回
BubbleSort(array: &stuArr, sortClosure:{
($0 as! Student).achievement > ($1 as! Student).achievement
})
5.后置閉包、逃逸閉包與自動(dòng)閉包
- 后置閉包
1.當(dāng)函數(shù)的最后一個(gè)參數(shù)為閉包參數(shù)時(shí),在調(diào)用函數(shù)的時(shí),可以將閉包結(jié)構(gòu)脫離出函數(shù)的參數(shù)列表,追加在函數(shù)的尾部
, 增強(qiáng)代碼的可讀性.
//后置閉包結(jié)構(gòu)
BubbleSort(array: &stuArr){
($0 as! Student).achievement > ($1 as! Student).achievement
}
//
2.函數(shù)只有一個(gè)參數(shù)且僅是閉包參數(shù)時(shí),調(diào)用函數(shù)時(shí),使用后置閉包寫法,可以省略函數(shù)參數(shù)列表
,例如下面的代碼:
//5.只有一個(gè)閉包參數(shù)的函數(shù)
func myFunc(closure:(Int,Int) -> Bool) {
}
//調(diào)用
myFunc{
$0 > $1
}
逃逸閉包
當(dāng)閉包傳遞進(jìn)函數(shù)時(shí),系統(tǒng)會(huì)為此閉包進(jìn)行內(nèi)存分配
概念:
函數(shù)內(nèi)的閉包在函數(shù)執(zhí)行結(jié)束后在函數(shù)外依然可以使用非逃逸閉包
概念:
當(dāng)函數(shù)的生命周期結(jié)束后,閉包將會(huì)被銷毀掉喇闸,不能繼續(xù)使用.換句話說,非逃逸閉包只能在函數(shù)內(nèi)部使用,在函數(shù)外部不能使用.
自動(dòng)閉包
不是所有的閉包都需要顯式
創(chuàng)建
嚴(yán)格條件:
此閉包不能有參數(shù)
在調(diào)用函數(shù)傳參時(shí), 閉包的實(shí)現(xiàn)只能由
一句表達(dá)式
組成
3.自動(dòng)閉包參數(shù)由@autoclosure
來申明
//自動(dòng)閉包
func myFunc2(closure:@autoclosure () -> Bool) {
}
//調(diào)用函數(shù)時(shí),直接傳入一個(gè)表達(dá)式,編譯器會(huì)自動(dòng)生成閉包參數(shù)
myFunc2( closure: 5 > 10)
//自動(dòng)閉包默認(rèn)為非逃逸閉包, 若要使用非逃逸類型的閉包參數(shù),需要使用關(guān)鍵字@escaping
申明
func myFunc3(closure:@autoclosure @escaping () -> Bool) {
}
總結(jié):
- 1.默認(rèn)定義的閉包都是非逃逸閉包.
- 2.非逃逸閉包
不可以
作為返回值返回询件,如果這么做燃乍,編譯器會(huì)拋異常 - 3.逃逸閉包常用于異步操作中, 例如
后臺(tái)接口請(qǐng)求完成后
要執(zhí)行閉包回調(diào),需要使用逃逸類型閉包
- 4.
自動(dòng)閉包默認(rèn)為非逃逸閉包
, 若要使用非逃逸類型的閉包參數(shù),需要使用關(guān)鍵字@escaping
申明