我是Swift的新手,当我遇到转义的闭包时,我正在阅读手册。我根本没有得到手册的描述。有人可以简单地向我解释一下Swift中的转义闭包是什么。
考虑此类:
class A { var closure: (() -> Void)? func someMethod(closure: @escaping () -> Void) { self.closure = closure } }
someMethod 将传入的闭包分配给类中的属性。
someMethod
现在是另一个类:
class B { var number = 0 var a: A = A() func anotherMethod() { a.someMethod { self.number = 10 } } }
如果我调用anotherMethod,则闭包{ self.number = 10 }将存储在的实例中A。由于self是在闭包中捕获的,因此的实例A还将对其具有很强的引用性。
anotherMethod
{ self.number = 10 }
A
self
基本上,这是逃脱的闭包的例子!
您可能想知道,“什么?那么封闭从何处逃脱到何处?”
闭包从方法的范围转义到类的范围。而且可以稍后调用,甚至可以在另一个线程上!如果处理不当,可能会导致问题。
默认情况下,Swift不允许闭包转义。您必须添加@escaping闭包类型,以告知编译器“请允许此闭包转义”。如果我们删除@escaping:
@escaping
class A { var closure: (() -> Void)? func someMethod(closure: () -> Void) { } }
并尝试编写self.closure = closure,它不会编译!
self.closure = closure