Swift逃逸闭包和非逃逸闭包



Swift 闭包

就像其他编程语言一样,Swift 也支持闭包。闭包是自包含的功能块,可以传递和使用在代码中执行任何特定任务。它可以分配给变量或作为参数传递给函数。闭包可以捕获其周围上下文中的值,并且可以用作回调或内联代码。Swift 支持以下类型的闭包:

  • 逃逸闭包
  • 非逃逸闭包

让我们详细讨论它们。

Swift 中的逃逸闭包

当闭包作为参数传递给函数,但该闭包在函数返回后被调用时,则这种类型的闭包称为逃逸闭包。默认情况下,作为参数传递给函数的闭包是非逃逸参数,这意味着闭包将在函数执行期间执行。

要将闭包声明为逃逸闭包,我们必须在表示逃逸闭包的参数类型之前使用@escaping关键字。

语法

以下是逃逸闭包的语法:

func methodname(closure: @escaping() -> Void){
   // body

   // Calling the closure
   closure()
}

示例

Swift 程序演示逃逸闭包。

import Foundation

class Operation{
    
   // Method that takes two numbers and an escaping closure to find their product
   func product(_ x: Int, _ y: Int, productResult: @escaping (Int) -> Void) {
    
      // Activating an asynchronous task
      DispatchQueue.global().async {
         let output = x * y
            
         // Calling escaping closure
         productResult(output)
      }
   }
}

// Creating object of Operation class
let obj = Operation()

// Accessing the method
obj.product(10, 4) { res in
   print("Product of 10 * 4 = \(res)")
}

// Activating the passage of time
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
   // It will be executed after a delay, simulating an asynchronous operation
}

输出

它将产生以下输出:

Product of 10 * 4 = 40

Swift 中的非逃逸闭包

非逃逸闭包是 Swift 中的默认设置,我们不需要任何特殊符号来表示非逃逸闭包。这种类型的闭包在其传递到的函数的执行期间执行,一旦函数的执行结束,闭包将不再可用。它们不会被存储以供以后执行。它们不会被存储供以后执行。

语法

以下是非逃逸闭包的语法:

mutating func methodname(Parameters) -> returntype {
   Statement
}

示例

Swift 程序演示非逃逸闭包。

class Operation {
    
   // Function that takes two numbers and a non-escaping closure to calculate their sum
   func sum(_ X: Int, _ Y: Int, add: (Int) -> Void) {
      let result = X + Y
        
      // Calling the non-escaping closure
      add(result)
   }
}

// Creating the object of operation class
let obj = Operation()

obj.sum(10, 12) { add in
   print("sum: \(add)")
}

输出

它将产生以下输出:

Sum: 22

逃逸闭包与非逃逸闭包

以下是逃逸闭包和非逃逸闭包的主要区别:

逃逸闭包 非逃逸闭包
它可以超出其传递到的函数的生命周期。 它在函数执行期间执行。
它可以存储为属性或分配给变量。 它不能存储,也不允许在函数作用域之外使用。
它通常用于异步操作,如网络请求等。 它通常用于同步操作,如简单的计算等。
@escaping 关键字用于创建逃逸闭包。 它是默认的闭包,不需要任何特殊的语法。
广告