七. 閉包/Closures

閉包是獨立的功能塊,可以傳遞并在代碼中使用。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自動閉包

少了個大括號
正常的樣子
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Swift 2.2 我總是覺得 Swift 的語法書有點晦澀。看的不是那么讓人理解。說實在話,語法書的閉包我看了好...
    Laughingg閱讀 461評論 0 1
  • 閉包是自包含的函數(shù)代碼塊,可以在代碼中被傳遞和使用。Swift 中的閉包與 C 和 Objective-C 中的代...
    窮人家的孩紙閱讀 1,808評論 1 5
  • 閉包是自包含的函數(shù)代碼塊,可以在代碼中被傳遞和使用。Swift 中的閉包與 C 和 Objective-C 中的代...
    雨影閱讀 762評論 0 2
  • * 閉包 是自包含的函數(shù)代碼塊,可以在代碼中被傳遞和使用。swift中的閉包和Objective-C中的代碼塊(b...
    EndEvent閱讀 893評論 4 8
  • 當你意識到喜歡一件事是因為想逃避另一件事時 那你應該停下 因為你會無法擺脫
    小隱形閱讀 146評論 0 0

友情鏈接更多精彩內(nèi)容