什么时候使用快速closures?

我已经去了几个月的开发,并渴望在我的编程模式中实现新的东西。

现在我正在学习闭包,并且对它的语法知之甚less,知道它可以用来代替callback。 以及在一些UIViewAnimation和分类中实现它。

但是,我真的想知道它的用途,除此之外,我们应该在我们的基本编程中使用闭包。 就像我们使用委托,当我们想从孩子发送信息到家长..所以任何解释或简短的例子,其实际上可以用在我们的日常快速编程会有帮助吗?

谁能告诉我这些封闭是如何计算价值的

reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } ) 

在这些例子中,名称和闭包作为一个方法的参数..但是,这实际上是如何计算的?

你能解释一下在这个animation代码中通过闭包的过程是如何工作的吗?

 UIView.animateWithDuration(duration: NSTimeInterval, animations: (() -> Void)?, completion: ((Bool) -> Void)?) 

我真的想知道stream量?

两个最常用的例子是Swift中的完成块和高阶函数。

完成块:例如,当你有一些耗时的任务时,你想要在任务完成时得到通知。 你可以使用闭包,而不是委托(或许多其他的东西)

 func longAction(completion: () -> ()) { for index in veryLargeArray { // do something with veryLargeArray, which is extremely time-consuming } completion() // notify the caller that the longAction is finished } //Or asynch version func longAction(completion: () -> ()) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { for elem in veryLargeArray { // do something with veryLargeArray, which is extremely time-consuming } dispatch_async(dispatch_get_main_queue(), { completion() // notify the caller that the longAction is finished }) } } longAction { print("work done") } 

在上面的例子中,当你有一个耗时的任务,你想知道什么时候for循环完成遍历非常大的数组。 你把闭包{ println("work done") }作为for循环完成后执行的函数的input参数,并打印出“work done”。 而发生的是,你给了一个函数(闭包)给longAction并命名为completion ,并且当你在longAction中调用completion时,该函数将被执行。

高阶函数:您可以使用闭包作为高阶函数的input参数,例如:

 let array = [1, 2, 3] let smallerThanTwo = array.filter { $0 < 2 } 

有了这个,你可以过滤掉小于2的数字。

已更新关于sorted (可能)如何工作:

所以,这个想法是,这个sorting将通过数组,并且将两个连续的元素(i,i + 1)相互比较,并且在需要的时候交换它们。 这是什么意思“如果需要”? 你提供了闭包{ (s1: String, s2: String) -> Bool in return s1 > s2 } ,如果s1的像素大于s2 ,则返回true 。 如果该闭包返回true ,那么sortedalgorithm将交换这两个元素,并将其与接下来的两个元素(i + 1,i + 2,如果未到达数组末尾)进行比较。 所以基本上你必须提供一个closures的sorted ,它会告诉“何时”交换元素。

  1. 通常,与其他function相比,“闭包”没有名称。 这意味着,如果您想将大量代码传递给某个函数,而无需将该代码包装到命名方法中,则可以在任何情况下使用它们。 sorting是最stream行的例子。

  2. 闭包可以使用其边界之外的variables。 所谓的“捕捉价值”

closures是这样的:

 { (params) -> returnType in statements } 

以下是为什么从Apple 文档使用它的一些原因

  • 从上下文中推断参数和返回值types
  • 来自单expression式闭包的隐式返回
  • 速记参数名称
  • 尾随闭包语法