闭包的认识:
闭包 (Closures) 是可以在你的代码里传递和使用的,自包含的功能代码块。Swift 里的闭包跟 C 和 Objective-C 里的 block 类似,也就是其他语言里的所谓的 lambda 。
闭包表达式语法的常见形式如下:
{ (参数列表) -> 返回值类型 in
一系列语句
}
闭包表达式可以使用常量参数,变量参数和 inout 参数,但是不允许参数默认值。可变参数仅允许出现在参数列表的末尾。元组 (Tuple) 类型也可以作为参数类型和返回值类型
let names = ["Chris","Alex","Ewa","Barry","Daniella"]
reversed = sort(names,{ (s1: String,s2: String) -> Bool in return s1 > s2 })
闭包的函数体 (body) 是通过 in 关键字开始的,这个关键字表示闭包的参数和返回值类型定义结束,接下来是闭包的函数体。
reversed = sort(names,{ s1,s2 in return s1 > s2 } )
如果将闭包传递给一个函数作为内联闭包,我们总是也许可以推断出它的参数类型和返回值类型,因此,你很少需要以完整的形式来编写内联闭包。
虽然如此,如果你愿意,你还是可以明确地写上类型,我们鼓励这样的方式,这可以让你的代码的阅读者避免歧义。
Swift 自动地为内联闭包提供了参数名的快速记法,可以使用
如果你在闭包表达式里使用参数名速记法,你可以从定义里忽略掉参数列表,从预期的函数类型就可以推断出速记法里的参数的序号数字和类型。in 关键字也可以被忽略,因为闭包表达式完全由它的函数体组成:
reversed = sort(names,{ $0 > $1 } )
这里的