swift學習之- 閉包

一、閉包的概念

     在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)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章