Published on

什么是闭包中的捕获列表

Authors
  • Name
    Twitter

捕获列表中的每个项目都是 weak 或 unowned 关键字与对类实例的引用 (如 self) 或初始化为某个值的变量 (如 delegate = self.delegate) 的配对。这些配对写在一对方括号内,用逗号分隔。

如果提供了闭包的参数列表和返回类型,则将捕获列表放在它们之前:

lazy var someClosure = {
    [unowned self, weak delegate = self.delegate]
    (index: Int, stringToProcess: String) -> String in 
}

我们可以给出一个详细的例子:

protocol MyDelegate: AnyObject {
    func didProcess(_ result: String)
}

class MyViewController {
    weak var delegate: MyDelegate?
    
    lazy var someClosure = {
        [unowned self, weak delegate = self.delegate]
        (index: Int, stringToProcess: String) -> String in
        let result = "Processed \(stringToProcess) at index \(index)"
        delegate?.didProcess(result)
        return result
    }
    
    func useClosure() {
        let result = someClosure(1, "Hello")
        print(result) // 输出: Processed Hello at index 1
    }
}

如果闭包没有指定参数列表或返回类型,因为它们可以从上下文推断出来,则将捕获列表放在闭包的最开始,后面跟着 in 关键字:

lazy  var someClosure = {
    [unowned self, weak delegate = self.delegate] in 
    //Closure body goes here
}