在 Swift 中,闭包可以捕获它们所在作用域中的变量和常量。当一个闭包在函数之外被保存和调用时,它就被认为是“逃逸”闭包。在这种情况下,闭包中访问结构体中的可变参数“self”会导致编译错误。
为了解决这个问题,可以使用“weak self”或“unowned self”避免闭包捕获结构体中的“self”。这些防止“循环引用”的技术可以确保在闭包执行时结构体中的“self”不会被保留,而是由闭包自己来保留。
下面是一个展示如何使用“weak self”来解决这个问题的代码示例:
struct Person {
var name: String = "John"
func doSomething(completionHandler: @escaping () -> Void) {
DispatchQueue.main.async { [weak self] in
self?.name = "Mary"
completionHandler()
}
}
}
var person = Person()
person.doSomething {
print(person.name)
}
在这个示例中,使用了“weak self”来避免闭包捕获结构体中的“self”。因此,在闭包中使用“self?.name”不会导致编译错误。
上一篇:闭包属性后的执行