Swift 中的转义和非转义闭包

2024 年 8 月 29 日 | 阅读 3 分钟

在 Swift 中,闭包可以定义为可以传递给方法或在代码中使用的自包含的代码块。但是,我们可以定义两种类型的闭包,即转义和非转义闭包。在 swift 5 中,闭包参数默认是非转义的。

闭包也可以在函数体中执行;如果我们需要转义闭包,我们可以将其标记为 @escaping。闭包可以捕获并存储对定义它们的上下文中的任何常量和变量的引用。这被称为对这些常量和变量的闭包。

在本文中,我们将讨论转义和非转义闭包。我们还将讨论为什么我们应该在代码中使用转义闭包。

非转义闭包

当我们将闭包作为参数传递给函数时,函数会执行闭包并返回编译器。在这里,一旦闭包被执行并且执行结束,传递的闭包就会超出范围,因此,它在内存中不再存在。非转义闭包在其生命周期内转换为以下状态。

  1. 闭包作为函数参数传递到函数调用中。
  2. 函数体被执行。
  3. 闭包与函数体一起执行。
  4. 函数将编译器返回。

示例

让我们考虑以下示例,其中函数接受一个非转义闭包作为参数。

在上面的示例中,我们将闭包传递给一个函数,该函数打印作为同一函数中另一个参数传递的数组的总和。在这里,函数 calculate_Sum 在主体结束时执行闭包。

在这里,我们没有转义闭包的执行。因此,闭包在执行后在内存中不存在。

转义闭包

转义闭包与非转义闭包不同,因为我们可以保留转义闭包以供以后执行。同时,函数体可以执行并将编译器返回。转义闭包的范围也存在于内存中,直到它被执行。我们可以根据我们的要求使用转义闭包。以下是转义闭包的几种方法。

1. 存储

转义闭包的一种方法是将闭包保存在函数外部定义的变量中,稍后执行它。这种方法用于我们需要使用启动异步操作并将闭包参数作为完成处理程序的情况。函数在启动操作后返回,但是闭包参数被保留以供以后调用。

考虑以下示例,其中 calculate_Sum() 接受一个转义闭包作为 completionHandler 参数,后者是一个类似的闭包类型变量。在这里,completionHandler 在函数执行后被调用。

异步执行

当我们在 DispatchQueue 上异步执行闭包时,闭包会由队列保存在内存中以供将来使用。在这种情况下,我们无法确定闭包何时执行。考虑以下示例。


下一主题#