为什么 swift 闭包默认是不可转义的?

问题描述 投票:0回答:3

我发现默认情况下的 swift 闭包是非转义闭包,但没有找到任何解释为什么会这样。

谁能解释一下吗?

swift
3个回答
2
投票

转义闭包会带来额外的内存管理问题。您可以创建保留循环。

map
(采用非转义闭包)不关心保留循环,因此您不必在闭包中添加
self
来提醒调用者存在危险。
DispatchQueue.async
采用转义闭包,因此调用者需要对闭包的生命周期多加考虑,因此需要额外的语法来警告调用者。如果转义是默认值,这将使本应简单的调用变得复杂并减少优化机会。


0
投票

在 Swift 中,闭包默认是非转义的。这意味着闭包不能比它作为参数传入的函数存在得更久。如果您需要在将函数传递给 return 后保留该闭包,则需要使用关键字 @escaping

来标记该闭包

0
投票

当然! Swift 闭包的默认行为是非转义,这是 Swift 语言设计者做出的设计选择。默认情况下使闭包不可逃逸的决定植根于安全性、可预测性和性能原则。

  1. 可预测性:通过默认使用非转义闭包,Swift 的目标是使代码更具可预测性。当您将闭包作为参数传递给函数时,您希望它在该函数的范围内执行。非逃逸闭包遵循这一期望,有助于代码的清晰度。

  2. 安全:非逃逸闭包有助于防止与保留周期和内存泄漏相关的潜在问题。当闭包是非转义的时,编译器可以对其生命周期做出假设,从而允许某些优化。当闭包想要超出函数的作用域时,开发人员需要明确地将闭包标记为转义。这种明确性有助于避免无意中强烈捕获自我,并降低保留周期的风险。

  3. 性能:非转义闭包使编译器能够应用转义闭包可能无法实现的优化。例如,编译器可以对闭包的生命周期做出假设,从而实现更有效的内存管理。

  4. 编译器优化:默认的非转义行为允许编译器进行某些转义闭包无法实现的优化。这些优化有助于提高 Swift 代码的整体性能。

© www.soinside.com 2019 - 2024. All rights reserved.