Swift开发中:非逃逸闭包、逃逸闭包、自动闭包的区别

1. 非逃逸闭包(Non-Escaping Closure)

  • 定义:默认情况下,在 Swift 中闭包是非逃逸的。这意味着闭包在函数结束之前被调用并完成,它不会"逃逸"出函数的范围。
  • 内存管理:由于闭包在函数返回前被调用,因此编译器可以优化内存管理。
  • 使用场景:如果一个函数接受一个闭包作为参数,并且在函数返回之前执行这个闭包,那么这个闭包就是非逃逸的。
javascript 复制代码
func performNonEscapingClosure(closure: () -> Void) {
    closure()
}

2. 逃逸闭包(Escaping Closure)

  • 定义:当一个闭包作为参数传递给函数,但在函数返回后某个时刻被调用,它就是逃逸闭包。这意味着闭包可以"逃逸"出函数的范围,并在未来的某个时间点执行。
  • 内存管理:逃逸闭包可能需要额外的内存管理,因为闭包需要在函数返回后仍然存活。
  • 使用场景:逃逸闭包常见于异步操作,比如网络请求或延时调用。在 Swift 中,通过在参数前加上 @escaping 关键字来标记逃逸闭包。
javascript 复制代码
func performEscapingClosure(completion: @escaping () -> Void) {
    DispatchQueue.main.async {
        completion()
    }
}

3. 自动闭包(Auto Closure)

  • 定义:自动闭包是一种自动创建的闭包,用来包装传递给函数作为参数的表达式。
  • 行为:这种闭包不接受任何参数,当它被调用时,会返回被包装在其中的表达式的值。
  • 使用场景:自动闭包常用于延迟表达式的求值,这意味着直到你调用闭包,代码才会执行。这特别有用于条件语句或延迟计算。
javascript 复制代码
func performAutoClosure(closure: @autoclosure () -> Bool) {
    if closure() {
        print("True")
    } else {
        print("False")
    }
}

performAutoClosure(closure: 2 > 1) // 输出 "True"

在这个例子中,2 > 1 这个表达式被转换成了一个自动闭包,然后作为参数传递给 performAutoClosure 函数。

小结

理解这三种闭包的区别有助于你更好地掌握 Swift 编程,尤其是在涉及到异步编程、内存管理和代码优化时。适当使用这些闭包可以使你的代码更加灵活和高效。

相关推荐
TouchWorld1 天前
iOS逆向-哔哩哔哩增加3倍速播放(2)-[横屏视频-半屏播放]增加3倍速播放
ios·swift
1024小神1 天前
xcode 中配置AR Resource Group并设置图片宽度等
ios·swiftui·ar·xcode·swift
Wcowin2 天前
OneClip 开发经验分享:从零到一的 macOS 剪切板应用开发
mac·swift·粘贴板
崽崽长肉肉2 天前
Swift中的知识点总结
ios·swift
代码不行的搬运工2 天前
面向RDMA网络的Swift协议
开发语言·网络·swift
大熊猫侯佩2 天前
拯救发际线行动:用 Swift 和 Image Playground 驾驭 AI 绘图
人工智能·ai·文生图·swift·图生图·imageplayground·apple 智能
linweidong3 天前
网易ios面试题及参考答案(下)
objective-c·swift·ios开发·切面编程·ios面试·苹果开发·mac开发
大熊猫侯佩3 天前
Swift 迭代三巨头(下集):Sequence、Collection 与 Iterator 深度狂飙
swift·编程语言·apple
大熊猫侯佩3 天前
Swift 迭代三巨头(中集):Sequence、Collection 与 Iterator 深度狂飙
swift·编程语言·apple
大熊猫侯佩3 天前
Swift 迭代三巨头(上集):Sequence、Collection 与 Iterator 深度狂飙
swift·编程语言·apple