zoukankan      html  css  js  c++  java
  • swift中闭包和逃逸闭包 [Escaping Closures] 的区别

    1 、官方连接

    2、所谓的逃逸闭包 即指 当闭包作为函数的参数传入时 默认情况下 函数执行完毕 闭包中的代码也就执行完了 方法中的变量和传入的闭包也就释放了

    如果想要传入的闭包不受当前函数的控制(即函数执行完成之后、闭包也能单独执行)、这个时候闭包就要以逃逸闭包的形式传入 即在闭包前加上关键字 @escaping

    注意: 在逃逸闭包中如果要使用当前对象的属性或者方法 需 加上 self

    3、参考代码:

    /// 存储闭包的数组
    var completionHandlers = [() -> Void]()
    /// 执行完成后 讲传入的闭包保存到定义的闭包数组中 由于传入的闭包生命周期不受当前函数控制 即需要定义为逃逸闭包
    func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
        completionHandlers.append(completionHandler)
    }
    /// 普通函数 执行函数 -> 执行函数中的闭包
    func someFunctionWithNonescapingClosure(closure: () -> Void) {
        closure()
    }
    
    class SomeClass {
        var x = 10
        func doSomething() {
            someFunctionWithEscapingClosure { self.x = 100 }
            someFunctionWithNonescapingClosure { x = 200 }
        }
    }
    
    let instance = SomeClass()
    instance.doSomething()
    print(instance.x)
    // Prints "200"
    
    completionHandlers.first?()
    print(instance.x)
    // Prints "100"

     4、实际应用

    class someVC {
        func getData(result: @escaping (String) -> Void) {
            print("开始获取数据")
            DispatchQueue.global().async {
                DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
                    result("数据++")
                }
            }
            print("结束获取数据")
        }
    }
    
    let vc = someVC()
    vc.getData { data in
        print("获取到了(data)")
    }
    //开始获取数据
    //结束获取数据
    //2s后打印 获取到了数据++
  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/ZhangShengjie/p/14282940.html
Copyright © 2011-2022 走看看