Swift中的闭包

By | 2015年5月17日

闭包相比其他语法略有点生涩,其实仔细理解,会发现闭包其实就是:把嵌套函数(将一个函数作为另一个函数的参数)通过一些简洁的语法来表达。

举个例子,需要对一个数组进行排序:

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中小于号符号的实现:

C8878B05-8188-4E2E-B12F-193EAF5C2C31