在Swift中,(()->;())和@escaping()->;之间有什么区别;无效的

在Swift中,(()->;())和@escaping()->;之间有什么区别;无效的,swift,escaping,closures,void,swift5,Swift,Escaping,Closures,Void,Swift5,(()->())和@escaping()->Void之间有什么区别 func foo(_ completion: (() -> ()) { } func boo(_ completion: @escaping () -> Void) { } 快速摘录 转义闭包 当闭包作为参数传递给函数,但在函数返回后被调用时,闭包被称为转义函数。当您声明一个将闭包作为其参数之一的函数时,可以在参数类型之前写入@escaping,以指示允许该闭包转义 闭包可以转义的一种方式是存储在函数外部定义的

(()->())和@escaping()->Void之间有什么区别

func foo(_ completion: (() -> ()) { }

func boo(_ completion: @escaping () -> Void) { }
快速摘录
转义闭包

当闭包作为参数传递给函数,但在函数返回后被调用时,闭包被称为转义函数。当您声明一个将闭包作为其参数之一的函数时,可以在参数类型之前写入@escaping,以指示允许该闭包转义

闭包可以转义的一种方式是存储在函数外部定义的变量中。例如,许多启动异步操作的函数都将闭包参数作为完成处理程序。函数在启动操作后返回,但直到操作完成后才会调用闭包。闭包需要转义,稍后再调用。例如:

var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}
someFunctionWithEscapingClosure(:)函数将闭包作为其参数,并将其添加到在函数外部声明的数组中。如果未使用@escaping标记此函数的参数,则会出现编译时错误。“

“let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()
// returns a value of 50

incrementByTen()
// returns a value of 60
上面的示例显示调用alsoIncrementByTen与调用incrementByTen是相同的。因为它们都引用相同的闭包,所以它们都递增并返回相同的运行总数

逃逸关闭
当闭包作为参数传递给函数,但在函数返回后被调用时,闭包被称为转义函数。当您声明一个将闭包作为其参数之一的函数时,可以在参数类型之前写入@escaping,以指示允许该闭包转义

闭包可以转义的一种方式是存储在函数外部定义的变量中。例如,许多启动异步操作的函数都将闭包参数作为完成处理程序。函数在启动操作后返回,但直到操作完成后才会调用闭包。闭包需要转义,稍后再调用。例如:

var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}
someFunctionWithEscapingClosure(:)函数将闭包作为其参数,并将其添加到声明为[…]的数组中。”


摘自:苹果公司《Swift编程语言(Swift 5.2)》,苹果图书


换句话说,@escaping如果试图引用当前对象中的方法,则闭包需要使用self。i、 e.SKActions的完成闭包就是一个很好的例子


非逃逸闭包不需要使用self。因为它们不用于引用对象。

在“中”搜索“转义”,但在函数返回后调用。“应该是”可以是而不是“是”。没有必要调用转义闭包,它完全有可能被丢弃