閉包是獨立的功能塊,可以傳遞并在代碼中使用。Swift中的關閉類似于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ù)結束前內(nèi)被調(diào)用,就是非逃逸閉包,即noescape 如果這個閉包是在函數(shù)執(zhí)行完成后才被調(diào)用,調(diào)用的地方超過了這個函數(shù)的范圍,就叫逃逸閉包
例如平常使用的masonry,就是非逃逸閉包,因為他是馬上執(zhí)行,而網(wǎng)絡請求則是逃逸閉包,因為他是延時執(zhí)行,甚至不執(zhí)行
蘋果官方舉的例子:

改函數(shù)結束時都沒有調(diào)用該函數(shù),只是把它加入到數(shù)組中,至于什么時候執(zhí)行,不知道!

someFunctionWithNonescapingClosure函數(shù)是立即執(zhí)行閉包,所以是非逃逸閉包,還有就是逃逸閉包需要用self來引用
5.Autoclosures自動閉包

少了個大括號

正常的樣子