閉包的概念:自包含的函數(shù)代碼塊
閉包的分類: 1.全局函數(shù)(有名字)谢翎,即第四節(jié)講到的函數(shù)
??????????????????? 2.閉包表達(dá)式(匿名)骂倘,能捕獲上下文中的常量或者變量帮掉,一般意義上的閉包
??????????????????? 3.嵌套函數(shù)
1).閉包表達(dá)式的語法:
{ (參數(shù)) -> 返回值類型? in
?? 執(zhí)行語句
}
如果沒有參數(shù)也沒有返回值類型粤策,則可以連同關(guān)鍵字“in”一起省略掉:
{?
??? 執(zhí)行語句
}
2).閉包的普遍用法:作為回調(diào)函數(shù)
例子:
//冒泡排序函數(shù) : 從大到小
func bubbleSort (inout array : [Int]) {
??? let count = array.count
??? for _ in 1? ..< count? {
???????? for j in 0 ..< count - 1 {
?????????????? if array[j + 1] > array[j] {
?????????????????? let temp = array[j + 1]
?????????????????? array[j + 1] = array[j]
?????????????????? array[j] = temp
???????? ? ? ? }
? ? ? ? ? }
??? }
}
var array = [10,11,12,1,4,30]
bubbleSort(&array)
print(array)? // [30, 12, 11, 10, 4, 1]
此函數(shù)只能按照單一從大到小規(guī)則來排序宇驾,如果想要有多種規(guī)則供選擇,則可以使用閉包:
func bubbleSort (inout array : [Int] , compareBlock :(Int ,Int) -> Int) {
?? let count = array.count
?? for _ in 0? ..< count - 1 {
????? for j in 0 ..< count - 1 {
???????? if compareBlock(array[j] , array[j + 1]) > 0 {
??????????? let temp = array[j + 1]
??????????? array[j + 1] = array[j]
??????????? array[j] = temp
????????? }
??????? }
???? }
}
bubbleSort(&array) ? { (a : Int , b : Int) -> Int in
??????? ?? if a > b {
?????????????? return 1
?????????? } else {
?????????????? return -1
??????????? }
}
/**
閉包參數(shù)類型可優(yōu)化為? 方式1 :{(a? , b? )? in???? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 方式2:{? }? 完全依靠swift上下文推斷
bubbleSort(&array)?? {
?????? if $0 > $1 {
?????????? return 1
??????? } else {
?????????? return -1
??????? }
}? // $0和$1代表默認(rèn)參數(shù)
*/
3). 閉包表達(dá)式的優(yōu)化
尾隨閉包:當(dāng)閉包表達(dá)式作為函數(shù)最后一個(gè)參數(shù)出現(xiàn)時(shí)碉京,可以把閉包表達(dá)式放在參數(shù)的括號(hào)外書寫:
func sort(inout array : [Int]? , block : (Int , Int) -> Int) {
? 執(zhí)行語句
}
sort(&array)? {
? 回調(diào)語句
}
單表達(dá)式的優(yōu)化:如果閉包內(nèi)只有一個(gè)return語句 則可以省略return:
原:
sort(&array)? {
? return $0 > $1
}
可簡(jiǎn)寫為:
sort(&array)? {
? $0 > $1
}
4).嵌套函數(shù)
func bubbleSort (inout array : [Int])? {
????? func swapFunc (a a:Int , b:Int) -> Void {
?????? }
?????? swapFunc(a: 1, b: 2)
}
5).閉包中捕獲上下文中的值
func getIncFunc(inc : Int) -> (Int) -> Int {
??? func incFunc(v : Int) -> Int {
?????? return v + inc
??? }
??? return incFunc
}
let incFunc1 = getIncFunc(5)
print(incFunc1(10))? //結(jié)果是15
可優(yōu)化為
func getIncFunc(inc : Int) -> (Int) -> Int {
?? return {
?????? return $0 + inc
?? }
}
inc的值被捕獲保留了