闭包相比其他语法略有点生涩,其实仔细理解,会发现闭包其实就是:把嵌套函数(将一个函数作为另一个函数的参数)通过一些简洁的语法来表达。
举个例子,需要对一个数组进行排序:
var arr = ["Chris","Apple","Bady","Wifi"]
通过sorted函数可以对数组进行排序:
//标准的闭包表达式 sorted(arr, { (s1:String, s2:String) -> Bool in return s1 < s2 })
sorted函数,第一个参数接受源数据,第二个参数是一个函数类型,它的类型是:(String,String) -> Bool。上面的写法是一个标准的闭包表达式,标准的格式为:
{ (参数) -> 返回类型 in 表达式Code }
现在进行一下简化,有这么几种方式:
1)根据上下文类型推断来简化
//上下文推断类型 sorted(arr, {s1,s2 in return s1 < s2 })
因为这个闭包是作为函数参数,所以swift知道它的参数类型,我们可以省略对参数的定义。
2)单表达式隐式返回
//单表达式 隐式返回 sorted(arr, {s1,s2 in s1 < s2})
由于这个闭包表达式明确了返回一个Bool类型,而闭包函数体只有一行很简单的表达式(s1 < s2),它始终返回一个Bool指,所以我们可以省略return关键字。
当遇到复杂的闭包,就不能这么写了。
3)参数名称缩写
//参数名称缩写 sorted(arr, {$0 < $1})
我们可以省略参数的定义,只写闭包函数体,此时参数使用$0,$1来表示
4)使用运算符简写
//使用运算符函数简化表达式 sorted(arr, <)
这是一个终极简洁的写法!已经简洁到反人类了,因为Swift为我们定义了该小于号的字符串实现方法,此方法和我们的闭包体的参数和返回类型都匹配。
下面是Swift中小于号符号的实现: