一尘不染

何时快速使用闭包?

swift

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

现在,我正在学习闭包,并且对其语法了解甚少,知道可以将其用于代替回调。以及在某些UIViewAnimation中实现和排序。

但是我真的想知道它的用途。也就是说,在基本编程中应该在哪里使用闭包。就像我们要从孩子向父母发送信息时使用委托一样。因此,在日常的快速编程中可以使用的有关其实际的任何解释或简短示例都会有所帮助?

谁能告诉我这些闭包实际上是如何计算价值的

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

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

您能否解释一下在此动画代码中传递闭包时它们如何工作:

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

我真的想知道流程吗?


阅读 207

收藏
2020-07-07

共1个答案

一尘不染

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循环完成其工作之后执行,并打印“ workdone”。然后发生的事情是,您给longAction提供了一个函数(闭包)并将其命名为completion,并且在您调用completionlongAction
时将执行该函数。

高阶函数: 可以将闭包用作高阶函数的输入参数,例如:

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

这样,您可以过滤出小于2的数字。

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

因此,想法是,排序后的数据将遍历数组,并将两个连续的元素(i,i + 1)相互比较,并在需要时交换它们。“如果需要”是什么意思?您提供的闭合值{ (s1: String, s2: String) -> Bool in return s1 > s2 }true如果s1逻辑上大于则返回s2。如果返回true了该闭包,则sorted算法将交换这两个元素,并将其与接下来的两个元素(如果未到达数组的末尾,则为i
+ 1,i + 2)进行计数。因此,基本上,您必须提供一个闭包,sorted该闭包将告诉“何时”交换为元素。

2020-07-07