# 閉包
### 什么是閉包
閉包是代碼中引用和傳遞的功能性的獨立模塊
### 閉包形式:
全局函數是一個有名字但不會捕獲任何值的閉包;
內嵌函數是一個有名字且能從其上層函數捕獲值的閉包;
閉包表達式是一個輕量級語法所寫的可以捕獲其上下文中常量或變量值的沒有名字的閉包。
### 閉包的優化:
- 利用上下文推斷形式參數和返回值的類型;
- 單表達式的閉包可以隱式返回;
- 簡寫實際參數名;
- 尾隨閉包語法
### 閉包表達式語法:
在很簡短的一行里面寫完的一種語法
{ (parameters) -> (return type) in
statements
}
閉包的函數整體部分由關鍵字 in 導入,這個關鍵字表示閉包的形式參數類型和返回類型定義已經完成,并且閉包的函數體即將開始
sorted(by:)://會根據你提供的排序閉包將已知類型的數組的值進行排序,返回新數組
let names = ["Chris","Alex","Ewa","Barry","Daniella"]
func backward(_ s1: String, _ s2: String) -> Bool {
return s1 > s2
}
var reversedNames = names.sorted(by: backward)
// reversedNames is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
提供排序閉包的一個方法是寫一個符合其類型需求的普通函數,并將它作為 sorted(by:) 方法的形式參數傳入
` reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )`
- 從語境中推斷類型:
` reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )`
- 從單表達式閉包隱式返回:
`reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )`
- 簡寫的實際參數名:Swift 自動對行內閉包提供簡寫實際參數名,你也可以通過 $0 , $1 , $2 等名字來引用閉包的實際參數值
` reversedNames = names.sorted(by: { $0 > $1 } )`
- 運算符函數簡寫:Swift 的 String 類型定義了關于大于號( >)的特定字符串實現,讓其作為一個有兩個 String 類型形式參數的函數并返回一個 Bool 類型的值
`reversedNames = names.sorted(by: >)`
### 尾隨閉包:
當需要將一個很長的閉包表達式作為函數最后一個實際參數傳遞給函數,使用尾隨閉包將增強函數的可讀性。尾隨閉包是一個被書寫在函數形式參數的括號外面(后面)的閉包表達式:
` reversedNames = names.sorted() { $0 > $1 }`
如果閉包表達式作為函數的唯一實際參數傳入,而你又使用了尾隨閉包的語法,那你就不需要在函數名后邊寫圓括號了:
` reversedNames = names.sorted { $0 > $1 }`
### 捕獲值:
一個閉包能夠從上下文捕獲已被定義的常量和變量。即使定義這些常量和變量的原作用域已經不存在,閉包仍能夠在其函數體內引用和修改這些值
### 引用類型閉包:
無論你什么時候安賦值一個函數或者閉包給常量或者變量,你實際上都是將常量和變量設置為對函數和閉包的引用
### 逃逸閉包:
當閉包作為一個實際參數傳遞給一個函數的時候,我們就說這個閉包逃逸了,因為它可以在函數返回之后被調用。
**使用關鍵字: \@escaping 明確閉包是逃逸的,使用時,必須顯式的引用self**
閉包可以逃逸的一種方法是被儲存在定義于函數外的變量里,例如: 多函數接收閉包實際參數來作為啟動異步任務的回調。函數在啟動任務后返回,但是閉包要直到任務完成——閉包需要逃逸,以便于稍后調用
### 自動閉包:
自動閉包是一種自動創建的用來把作為實際參數傳遞給函數的表達式打包的閉包。它不接受任何實際參數,并且當它被調用時,它會返回內部打包的表達式的值。這個語法的好處在于通過寫普通表達式代替顯式閉包而使你省略包圍函數形式參數的括號
自動閉包允許你延遲處理,因此閉包內部的代碼直到你調用它的時候才會運行
**使用關鍵字: \@autoclosure 標志標記它的形式參數使用了自動閉包**
Swift3-block閉包
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
推薦閱讀更多精彩內容
- 本章將會介紹 閉包表達式尾隨閉包值捕獲閉包是引用類型逃逸閉包自動閉包枚舉語法使用Switch語句匹配枚舉值關聯值原...