闭包的三种表现形式:
1.全局函数:有名字但是不会捕获任何值的闭包。
2.嵌套函数:有名字可以捕获器封闭函数域内值的闭包。
3.闭包表达式:没有名字可以捕获上下文常量或者变量的闭包。 闭包表达式的作用类似与oc中的block,c++中的lambdas表达式一样,就是把函数(代码块)像参数一样传递。闭包表达式语法:
{(参数列表)—>返回值类型 in
代码块
}
闭包是引用类型,对闭包/函数赋值就是将该闭包/函数的值设置为对应函数的引用。
闭包表达式举例:
调用函数是根据参数不同大括号的位置可以有不同写法
闭包作为参数
func someFunctionThatTakesAClosure(closure: () -> Void) {
// function body goes here
}//声明一个带有闭包表达式作为参数的函数
someFunctionThatTakesAClosure({
// closure's body goes here
})//第一种方式:调用函数时闭包体可以这样写
someFunctionThatTakesAClosure() {
// trailing closure's body goes here
}//第二种方式:调用函数时闭包体可以这样写
someFunctionThatTakesAClosure{
// trailing closure's body goes here
}//第三种方式:调用函数时如果函数不需要其他参数,闭包体可以这样写```
#####闭包作为返回值
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementer() -> Int {
runningTotal += amount
return runningTotal
}
return incrementer
} ```
闭包表达式做数组的元素
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: () -> Void) {
completionHandlers.append(completionHandler)
}```
#####函数操作符
在类和结构体里面实现了函数操作符你可以重写函数操作符或者自定义函数操作符。例如在结构体里面重写+运算符达到两个结构体相加的目的
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))```