一尘不染

在Swift中转义闭包

swift

我是Swift的新手,当我遇到转义的闭包时,我正在阅读手册。我根本没有得到手册的描述。有人可以简单地向我解释一下Swift中的转义闭包是什么。


阅读 238

收藏
2020-07-07

共1个答案

一尘不染

考虑此类:

class A {
    var closure: (() -> Void)?
    func someMethod(closure: @escaping () -> Void) {
        self.closure = closure
    }
}

someMethod 将传入的闭包分配给类中的属性。

现在是另一个类:

class B {
    var number = 0
    var a: A = A()
    func anotherMethod() {
        a.someMethod { self.number = 10 }
    }
}

如果我调用anotherMethod,则闭包{ self.number = 10 }将存储在的实例中A。由于self是在闭包中捕获的,因此的实例A还将对其具有很强的引用性。

基本上,这是逃脱的闭包的例子!

您可能想知道,“什么?那么封闭从何处逃脱到何处?”

闭包从方法的范围转义到类的范围。而且可以稍后调用,甚至可以在另一个线程上!如果处理不当,可能会导致问题。

默认情况下,Swift不允许闭包转义。您必须添加@escaping闭包类型,以告知编译器“请允许此闭包转义”。如果我们删除@escaping

class A {
    var closure: (() -> Void)?
    func someMethod(closure: () -> Void) {
    }
}

并尝试编写self.closure = closure,它不会编译!

2020-07-07