- Published on
什么是闭包中的捕获列表
- Authors
- Name
捕获列表中的每个项目都是 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
}