Swift学习

178 阅读2分钟

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)

适用场景:

  • 异步调用: 如果需要调度队列中异步调用闭包, 这个队列会持有闭包的引用,至于什么时候调用闭包,或闭包什么时候运行结束都是不可预知的.
  • 存储: 需要存储闭包作为属性,全局变量或其他类型做稍后使用.