閉包是獨立的功能塊源织,可以傳遞并在代碼中使用琢融。Swift中的關(guān)閉類似于C和Objective-C中的block以及其他編程語言中的Lambdas
1.形式:
{(參數(shù)) - >返回類型? in
聲明
}
基本形式,完整
作為參數(shù),已經(jīng)能夠確定該閉包的函數(shù)類型,即什么參數(shù)什么返回值,所以可以省略
因為閉包中只有一行代碼,所以不會造成歧義的情況下,return可以省略
更加簡便的方式,$0,$1..這是swift提供的一些速記的編寫方式
還有更加簡便的方式,不過適用條件比較特定了
2.尾閉包
尾閉包
如果提供了一個閉包表達式作為函數(shù)或方法的唯一參數(shù),并且您將該表達式提供為尾隨閉包,則()在調(diào)用函數(shù)時,不需要在函數(shù)或方法名稱后面寫入一對括號
小括號都省略
尾閉包,說的就是最后一個參數(shù)是閉包,可以不用寫在函數(shù)參數(shù)的小括號中,直接寫在外面大括號中就行了,總之就是為了寫法更加簡便,意義沒有什么變化
3.Capturing Values/捕捉值
函數(shù)1里面包含另一個函數(shù)2,函數(shù)2使用了函數(shù)1的局部變量
不斷調(diào)用返回的函數(shù)2,原先的參數(shù)會不斷積累
個人理解是,返回的incrementByTen是一個對象,他有保存了它的值,所以會不斷的積累
4.Escaping Closures逃逸閉包
簡單點介紹就是,如果這個閉包是在這個函數(shù)結(jié)束前內(nèi)被調(diào)用,就是非逃逸閉包,即noescape 如果這個閉包是在函數(shù)執(zhí)行完成后才被調(diào)用,調(diào)用的地方超過了這個函數(shù)的范圍,就叫逃逸閉包
例如平常使用的masonry,就是非逃逸閉包,因為他是馬上執(zhí)行,而網(wǎng)絡請求則是逃逸閉包,因為他是延時執(zhí)行,甚至不執(zhí)行
蘋果官方舉的例子:
改函數(shù)結(jié)束時都沒有調(diào)用該函數(shù),只是把它加入到數(shù)組中,至于什么時候執(zhí)行,不知道!
someFunctionWithNonescapingClosure函數(shù)是立即執(zhí)行閉包,所以是非逃逸閉包,還有就是逃逸閉包需要用self來引用
5.Autoclosures自動閉包
少了個大括號
正常的樣子