閉包的三種表現(xiàn)形式:
1.全局函數(shù):有名字但是不會(huì)捕獲任何值的閉包忌穿。
2.嵌套函數(shù):有名字可以捕獲器封閉函數(shù)域內(nèi)值的閉包莫辨。
3.閉包表達(dá)式:沒有名字可以捕獲上下文常量或者變量的閉包傲茄。 閉包表達(dá)式的作用類似與oc中的block,c++中的lambdas表達(dá)式一樣衔掸,就是把函數(shù)(代碼塊)像參數(shù)一樣傳遞烫幕。閉包表達(dá)式語法:
{(參數(shù)列表)—>返回值類型 in
代碼塊
}
閉包是引用類型,對閉包/函數(shù)賦值就是將該閉包/函數(shù)的值設(shè)置為對應(yīng)函數(shù)的引用敞映。
閉包表達(dá)式舉例:
調(diào)用函數(shù)是根據(jù)參數(shù)不同大括號的位置可以有不同寫法
閉包作為參數(shù)
func someFunctionThatTakesAClosure(closure: () -> Void) {
// function body goes here
}//聲明一個(gè)帶有閉包表達(dá)式作為參數(shù)的函數(shù)
someFunctionThatTakesAClosure({
// closure's body goes here
})//第一種方式:調(diào)用函數(shù)時(shí)閉包體可以這樣寫
someFunctionThatTakesAClosure() {
// trailing closure's body goes here
}//第二種方式:調(diào)用函數(shù)時(shí)閉包體可以這樣寫
someFunctionThatTakesAClosure{
// trailing closure's body goes here
}//第三種方式:調(diào)用函數(shù)時(shí)如果函數(shù)不需要其他參數(shù)较曼,閉包體可以這樣寫```
#####閉包作為返回值
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementer() -> Int {
runningTotal += amount
return runningTotal
}
return incrementer
} ```
閉包表達(dá)式做數(shù)組的元素
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: () -> Void) {
completionHandlers.append(completionHandler)
}```
#####函數(shù)操作符
在類和結(jié)構(gòu)體里面實(shí)現(xiàn)了函數(shù)操作符你可以重寫函數(shù)操作符或者自定義函數(shù)操作符。例如在結(jié)構(gòu)體里面重寫+運(yùn)算符達(dá)到兩個(gè)結(jié)構(gòu)體相加的目的
struct Vector2D {
var x = 0.0, y = 0.0
}
func + (left: Vector2D, right: Vector2D) -> Vector2D {
return Vector2D(x: left.x + right.x, y: left.y + right.y)
}
let vector = Vector2D(x: 3.0, y: 1.0)
let anotherVector = Vector2D(x: 2.0, y: 4.0)
let combinedVector = vector + anotherVector
// combinedVector is a Vector2D instance with values of (5.0, 5.0))```