在Swift 3中逃避闭包

如果将闭包作为参数传递给函数,并且在函数返回后调用该闭包,则闭包正在转义。

在Swift 2中,您可以使用@noescape属性标记一个函数参数,告诉编译器不允许传递给该函数的闭包对函数主体进行转义。 在Swift 2中,闭包默认情况下转义了函数体。

在Swift 3中,当函数具有闭包作为参数时。 我们需要将其明确标记为@ 转义,因为 默认情况下,闭包在swift 3中不会转义。

为什么不逃避?

默认情况下,使闭包不转义有很多好处。 最明显的好处是性能和编译器优化代码的能力。 如果编译器知道闭包是非转义的,则它可以处理内存管理的许多细节。

这也意味着您可以在无转义的闭包中使用self关键字而不会出现问题,因为闭包是在函数返回之前被调用的。 在闭包中不需要使用对self的弱引用。 这是一个免费的不错的好处。

例如

在Swift 3中,如果您有一个带有闭包参数的函数,并将其分配给在函数外部定义的变量,则此闭包可以通过存储在此外部变量中而从函数主体中逸出。

Swift编译器将给出如下错误

因此,您必须将闭包显式设置为@escaping