1.闭包
1.1 闭包概念
它本质是代码块, 它是函数的升级版本,函数是有名称、可复用的代码块,闭包则是比函数更加灵活的匿名代码块。
为什么使用闭包?
我们习惯了传递一个值:Int,一串符号:String,一个对象:Class,但是有时我们需要传递一种处理问题的逻辑,我们常用的类型似乎满足不了这种需求,而函数恰好是一种处理问题的逻辑,为了让函数像Int、Float、String等常用类型一样灵活的传递和调用,闭包就出现了
函数、嵌套函数、闭包
//函数
func eatTomatos(a: Int, b: Int) -> Int {
return a + b
}
//嵌套函数
func eatTomatos(a: Int, b: Int) -> Int {
//嵌套函数
func digest(a: Int, b: Int) -> Int {
return 2 * a + b
}
return digest(a: a, b: b)
}
//闭包
var eatTomatos = {(a: Int, b: Int) -> Int in
return a + b
}
1.2 闭包起别名
typealias Tomato = (Int, Int) -> Int
func gainTomatos() -> (Int, Int) -> Int {
return eatTomatos
}
可以写成
func gainTomatos() -> Tomato {
return eatTomatos
}
var eatTomatos: (Int, Int) -> Int = {(a: Int, b: Int) -> Int in
return a + b
}
可以写成
var eatTomatos: Tomato = {(a: Int, b: Int) -> Int in
return a + b
}
1.3 逃逸包和非逃逸包
非逃逸包(默认)

逃逸包(@escaping说明)

@escaping 修饰闭包
func someMethod(closure: @escaping () -> Void) {
// 特别行动
}
typealias DataReply = (ZYLResponse) -> Void
open static func post(url: String, parameters: Dictionary<String, Any>?, complete: @escaping DataReply)
适用场景:
- 异步调用: 如果需要调度队列中异步调用闭包, 这个队列会持有闭包的引用,至于什么时候调用闭包,或闭包什么时候运行结束都是不可预知的.
- 存储: 需要存储闭包作为属性,全局变量或其他类型做稍后使用.