Inferring Type From Context 上下文类型判断
因为排序的闭包是作为一个参数传递给函数,因此Swift可以判定这个参数的类型和根据sort函数第二个参数判断返回值的类型.这个参数的类型是(String, String) -> Bool,这意味着 String,String以及Bool类型都不需要在闭包定义的时候声明.因为所有的类型都可以由系统判定.因此,返回箭头以及参数名字的括号都可以省略:
reversed = sort(names, { s1, s2 in return s1 > s2 } )
当在闭包在传递给函数的时候,总是默认的会判定参数的类型和返回值的类型,因此你很少需要自己写一个标准完整的闭包格式.
无论怎样,你可以按照你希望的样子显示的声明类型.为了避免歧义性,这样的方式是积极鼓励推荐的.在sort函数的例子中,闭包的目的是非常清晰.
Implicit Returns from Single-Expression Closures (单表达式闭包的隐式返回)
单表达式闭包可以通过忽略关键字return,隐式的返回单表达式的结果:
reversed = sort(names, { s1, s2 in s1 > s2 } )
在这里,sort函数类型的第二个参数明确的要求闭包返回一个Bool值,因为闭包体包含一个单表达式(s1 > s2),它返回一个Bool值,这样可以忽略return关键字.
Shorthand Argument Names (缩写的参数名)
Swift中,系统自动的为内联闭包提供了参数缩写名,$0,$1,$2..等等,它可以用来代指闭包参数的值.
如果你在闭包表达式中使用了缩写名,你可以忽略闭包参数列表,缩写名的值和类型系统会根据函数类型推断出来,并且int关键字也可以省略.:
reversed = sort(names, { $0 > $1 } )
这里,$0,$1代指闭包的第一个和第二个参数.
Operator Functions (操作函数)
上面的闭包表达式实际上有更短的写法.
Swift的String类型定义了一个专门的大于操作方法(>)用于有两个String类型参数的函数,它返回一个Bool类型的值,这刚刚好匹配了sort函数的第二个参数需求,因此你可以简单的传一 个大于操作(>),系统将判断出你需要的东西:
reversed = sort(names, >)