diff --git a/source/chapter2/Closures.md b/source/chapter2/Closures.md index 242623b4..6c22b39a 100644 --- a/source/chapter2/Closures.md +++ b/source/chapter2/Closures.md @@ -17,8 +17,8 @@ Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下: * 利用上下文推断参数和返回值类型 -* 对于单表达式闭包可以不写return -* 简单的参数命名 +* 单表达式闭包可以省略 `return` 关键字 +* 参数名称缩写 * Trailing 闭包语法 ### 闭包表达式 @@ -85,6 +85,41 @@ reversed = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } ) 这说明 `sort` 函数的整体调用保持不变,已对圆括号仍然包裹住了函数中整个参数集合。而其中一个参数现在变成了内联闭包(相比于 `backwards` 版本的代码)。 +##### 根据上下文推断类型 + +因为排序闭包是作为函数的参数进行传入的,Swift可以推断其参数和返回值的类型。`sort` 期望第二个参数是类型为 `(String, String) -> Bool` 的函数,因此实际上 `String`, `String` 和 `Bool` 类型并不需要作为闭包表达式定义中的一部分。因为所有的类型都可以被正确推断,返回箭头 (->) 和 围绕在参数周围的括号也可以被省略: + +``` +reversed = sort(names, { s1, s2 in return s1 > s2 } ) +``` + +实际上任何情况下,通过内联闭包表达式构造的闭包作为参数传递给函数时,都可以推断出闭包的参数和返回值类型,这意味着您几乎不需要利用完整格式构造一个内联闭包。 + +##### 单行表达式闭包可以省略 `return` + +单行表达式闭包可以通过隐藏 `return` 关键字来隐式返回单行表达式的结果,如上版本的例子可以改写为: + +``` +reversed = sort(names, { s1, s2 in s1 > s2 } ) +``` + +在这个例子中,`sort` 函数的第二个参数函数类型明确了闭包必须返回一个 **Bool** 类型值。因为闭包函数体只包含了一个单一表达式 (s1 > s2),该表达式返回 **Bool** 类型值,因此这里没有歧义,`return`关键字可以省略。 + +##### 参数名称缩写 + +Swift 自动为内联函数提供了参数名称缩写功能,您可以直接通过 `$0`,`$1`,`$2` 来顺序调用闭包的参数。 + +如果您在闭包表达式中使用参数名称缩写,您可以在闭包参数列表中省略对其的定义,并且对应参数名称缩写的类型会通过函数类型进行推断。`in` 关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成: + +``` +reversed = sort(names, { $0 > $1 } ) +``` + +在这个例子中,`$0` 和 `$1` 表示闭包中第一个和第二个 **String** 类型的参数。 + + + +