当闭包找不到属性时,有以下几种解决方法:
@escaping
声明逃逸闭包:如果闭包需要在函数返回后继续被调用,需要使用 @escaping
声明闭包。这样闭包会被保存在堆上,而不是栈上,从而在函数返回后仍然可以访问闭包内的属性。示例代码:
func myFunction(completion: @escaping () -> Void) {
var myProperty = 10
DispatchQueue.main.async {
print(myProperty) // 闭包中可以访问到 myProperty 属性
completion()
}
}
myFunction {
print("Closure executed")
}
[weak self]
或 [unowned self]
来避免循环引用,从而使闭包内部可以访问到属性。示例代码:
class MyClass {
var myProperty = 10
func myFunction(completion: () -> Void) {
DispatchQueue.main.async { [weak self] in
if let self = self {
print(self.myProperty) // 闭包中可以访问到 self.myProperty 属性
}
completion()
}
}
}
let myObject = MyClass()
myObject.myFunction {
print("Closure executed")
}
以上是两种常见的解决方法,具体应根据实际情况选择合适的方法。