在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标记此函数的参数,则会得到编译时错误。