一、閉包的概念
在swift中的閉包中被稱爲結構塊,可以在任何地方被調用,它就像C和OC語言中的內置函數一樣。函數內部定義的常量和變量引用可被捕獲並存儲在閉包。閉包可分爲三大類:
1、全局函數:有名字但不捕獲任何值;
2、嵌套函數:有名字從封閉函數捕捉值;
3、閉合表達式:無名字從相鄰塊捕獲值;
閉合表達式的優化,重量輕語法風格,其中包括:
(1)推導參數並從上下文菜單獲取返回值的類型
(2)從單封表達的隱性返回
(3)簡略參數名稱
(4)尾部閉包語法
二、閉包表達式語法:
函數
func funcName(參數) -> 返回值類型{
執行語句
}
閉包表達式
{ (參數)->返回值類型 in
執行語句
}
1、定義一個有兩個參數的閉包
let add:(Int, Int) ->Int = { (a: Int, b: Int) ->Int in
return a + b
}
//調用時通過賦值給一個常量或者變量
print(add(3,5))
2.閉包表達式回調用法
//寫一個排序的閉包進行回調
func bubbleSort(inout array: [Int], cmp:(Int, Int) ->Int) {
let cnt = array.count
for i in 1 ..< cnt {
for j in 0 ..< cnt - i {
if(cmp(array[j], array[j + 1]) == -1) {
let t = array[j]
array[j] = array[j + 1]
array[j + 1] = t
}
}
}
}
var array = [20, 5, 6, 13, 45, 3]
let intCmp = {
(a: Int, b: Int) ->Int in
if a > b {
return -1
} else if a < b {
return 1
} else {
return 0
}
}
bubbleSort(&array, cmp: intCmp)
print(array)
//print(bubbleSort(intCmp))
//如果一個閉包的類型已知, 比如作爲一個回調函數,你可以忽略參數的類型和返回值。單個語句的閉包會把他語句的值當做結果返回。
3. 嵌套函數(閉包捕獲上下文的值)
func bubbleSortFunc1(inout array1: [Int]) {
let cnt1 = array1.count
func swapValue(inout a: Int, inout b: Int) {
let t = a
a = b
b = t
}
for i in 1 ..< cnt1 {
for j in 0 ..< cnt1 - i {
if (array1[j] > array1[j + 1]) {
swapValue(&array1[j], b: &array1[j + 1])
}
}
}
}
var array1 = [4, 6, 2, 1, 11, 90, 67, 80]
bubbleSortFunc1(&array1)
print(array1)