The two most commonly used cases are completion blocks and higher order functions in Swift.
Completion blocks: For example, when you have a time-consuming task and want to be notified when it is finished, you can use closures instead of a delegate (or many other things).
func longAction(completion: () -> ()) {
for index in veryLargeArray {
}
completion()
}
func longAction(completion: () -> ()) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
for elem in veryLargeArray {
}
dispatch_async(dispatch_get_main_queue(), {
completion()
})
}
}
longAction { print("work done") }
在上面的例子中,当你有一个耗时的任务时,你想知道for循环何时完成对非常大的数组的迭代。你将闭包
{ println("work done") }
作为函数的输入参数,该函数将在for循环完成其工作后执行,并打印"work done"。发生的情况是,你向longAction提供了一个函数(闭包)并将其命名为
completion
,当你在longAction中调用
completion
时,该函数将被执行。
高阶函数:你可以将闭包作为高阶函数的输入参数,例如:
let array = [1, 2, 3]
let smallerThanTwo = array.filter { $0 < 2 }
通过这个,你可以过滤掉小于2的数字。
更新 关于 sorted
(可能)如何工作:
所以,思路是,sorted
会遍历数组,并将两个相邻元素(i,i + 1)进行比较,如果需要,则交换它们。什么是“如果需要”?您提供了闭包{(s1:String,s2:String) -> Bool in return s1>s2}
,它将返回true
如果s1
lexiographically大于s2
。如果该闭包返回true
,则sorted
算法将交换这两个元素,并继续对下两个元素进行操作(如果未到达数组的末尾,则为i + 1,i + 2)。因此,基本上您必须为sorted
提供一个闭包,告诉它“何时”交换两个元素。