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后打印 获取到了数据++
复制代码

 

posted @   ZhangShengjie  阅读(632)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示