闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift会为您管理在捕获过程中涉及到的内存操作。
注意:如果您不熟悉捕获(capturing) 这个概念也不用担心,后面会详细对其进行介绍。在 Swift函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一:
Swift的闭包表达式拥有简洁的风格,并鼓励在常见场景中以实现语法优化,主要优化如下:
闭包表达式
嵌套函数是一种在较复杂函数中方便进行命名和定义自包含代码模块的方式。 当然,有时候撰写小巧的没有完整定义和命名的类函数结构也是很有用处的,尤其是在处理一些函数并需要将另外一些函数作为该函数的参数时。闭包表达式是一种利用简洁语法构建内联闭包的方式。 闭包表达式提供了一些语法优化,使得撰写闭包变得简单明了。 下面闭包表达式的例子通过使用几次迭代展示了sort函数定义和语法优化的方式。 每一次迭代都用更简洁的方式描述了相同的功能。
sort函数
Swift 标准库提供了sort函数,会根据您提供的排序闭包将已知类型数组中的值进行排序。 一旦排序完成,函数会返回一个与原数组大小相同的新数组,该数组中包含已经正确排序的同类型元素。下面的闭包表达式示例使用sort函数对一个String类型的数组进行字母逆序排序,以下是初始数组值:
- let names = ["Chris","Alex","Ewa","Barry","Daniella"]
该例子对一个String类型的数组进行排序,因此排序闭包需为(String,String) -> Bool类型的函数。
提供排序闭包的一种方式是撰写一个符合其类型要求的普通函数,并将其作为sort函数的第二个参数传入:
- func backwards(s1: String,s2: String) -> Bool {
- return s1 > s2
- }
- var reversed = sort(names,backwards)
- // reversed is equal to ["Ewa","Daniella","Chris","Alex"]