在Swift-4中玩闭包(Part -2)
大家好 !! 在上一篇文章中,我们都讨论了Swift中的一些基本闭包。如果您尚未对其进行检查,请进行检查。在本教程中,我们将讨论更多内容。
Swift会自动为内联闭包提供简写参数名称,可用于通过名称$ 0,$ 1,$ 2等来引用闭包参数的值。
速记参数名称
正如我们上面讨论的,Swift 4通过表示$ 0,$ 1,$ 2-$ n来方便用户将内联闭包表示为速记参数名。通过在闭包表达式中使用此速记参数名,我们可以从其定义中省略闭包的参数列表。 in 关键字 由于闭包表达式完全由其主体组成,因此可以省略。请看以下示例。
因此,在第一个示例中创建了一个闭包,该闭包采用单个参数并返回字符串。此处$ 0表示第一个参数。类似地,在第二个示例中,闭包采用两个参数,通过使用$ 1,我们引用了第二个参数。关闭
自动关闭
我们知道闭包可以用作函数中的参数。当我们编写@autoclosure时 ,参数会自动包裹在闭包中。但是,如果我们创建一个具有@autoclosure的函数,则存在一个问题,通常调用该函数具有自动关闭功能的函数,但是实现这种功能并不常见。 让我们举一个小例子。
func simpleFunctionwithoutAutoclosure(_ parameters:()-> Void){
打印(“嘿,我们刚刚创建了一个没有@autoclosure属性的函数”)
参数()
}
simpleFunctionwithoutAutoclosure({
打印(“ hello”)
})
func simpleFunctionwithAutoclosure(_参数:@autoclosure()->无效){
打印(“嘿,我们刚刚创建了一个具有@autoclosure属性的函数”)
参数()
}
simpleFunctionwithAutoclosure(print(“ hii”))
并且输出如下
从上面的两个函数中,我们注意到,在@autoclosure的情况下,无需将表达式用大括号括起来。 如果要传递闭包而不是自动闭包,这就是我们需要做的。
逃逸关闭
当闭包作为函数的参数传递给闭包时,闭包被认为是对函数的转义,但是在函数返回后会被调用。 声明将闭包作为其参数之一的函数时,可以在参数的类型之前编写@escaping,以指示允许对闭包进行转义。
Apple的文档给出了一个示例,该示例将传递给函数的闭包附加到您的类/结构中可变的闭包数组中:
varcompleteHandlers:[()->无效] = []
func someFunctionWithEscapingClosure(completionHandler:@escaping()-> Void){
completeHandlers.append(completionHandler)
}
如我们所见,这遵循
1.通行证关闭
2. someFunctionWithEscapingClosure返回,
3.执行关闭
如果不使用@escaping标记此函数的参数,则会得到编译时错误。