Skip to content
@escaping VS @autoclosure
SwiftUISwift12/30/2023

@autoclosure@escaping 是两个不同的属性,用于不同的目的。下面分别解释它们的作用和区别:

@autoclosure:

  • 用于函数参数。

  • 允许将参数的表达式以闭包的形式传递给函数,而不会立即执行。

  • 主要用于提高代码的简洁性和性能,延迟求值。

  • 示例:

    swift
    func withAutoclosure(_ closure: @autoclosure () -> String) {
        print("Executing closure: \(closure())")
    }
    
    // 调用时直接传递表达式,无需显式闭包
    withAutoclosure("Hello, World!")
    func withAutoclosure(_ closure: @autoclosure () -> String) {
        print("Executing closure: \(closure())")
    }
    
    // 调用时直接传递表达式,无需显式闭包
    withAutoclosure("Hello, World!")

@escaping:

  • 用于函数参数。

  • 指示该参数的闭包可能在函数返回之后被调用,即逃逸出函数的作用域。

  • 主要用于异步操作,比如将闭包作为参数传递给一个异步函数,因为异步操作可能在函数返回之后执行。

  • 示例:

    swift
    typealias CompletionHandler = () -> Void
    
    func performAsyncTask(completion: @escaping CompletionHandler) {
        // 异步操作完成后调用传入的闭包
        DispatchQueue.main.async {
            completion()
        }
    }
    typealias CompletionHandler = () -> Void
    
    func performAsyncTask(completion: @escaping CompletionHandler) {
        // 异步操作完成后调用传入的闭包
        DispatchQueue.main.async {
            completion()
        }
    }

在某些情况下,@autoclosure@escaping 可以一起使用,以实现延迟求值和在异步操作中使用闭包。例如:

swift
func performAsyncTask(completion: @escaping @autoclosure CompletionHandler) {
    // 异步操作完成后调用传入的闭包
    DispatchQueue.main.async {
        completion()
    }
}

// 调用时直接传递表达式,无需显式闭包
performAsyncTask(completion: print("Async task completed"))
func performAsyncTask(completion: @escaping @autoclosure CompletionHandler) {
    // 异步操作完成后调用传入的闭包
    DispatchQueue.main.async {
        completion()
    }
}

// 调用时直接传递表达式,无需显式闭包
performAsyncTask(completion: print("Async task completed"))

这个例子中,@autoclosure 用于提供延迟求值,而 @escaping 用于指示闭包可能在异步操作中逃逸出函数的作用域。