Swift 中的闭包表达式

闭包是自包含的函数代码块,可以在代码中被传递和使用
闭包可以捕获和存储其所在上下文中的任意常量和变量的引用

Swift 闭包表达式具有简洁的风格,主要的语法优化如下:

  1. 利用上下文推断参数和返回值类型
  2. 隐式返回单表达式闭包,就是单表达式闭包可以省略return关键字
  3. 参数名称缩写
  4. 尾随闭包语法(Trailing Closure Syntax) 闭包表达式语法
    1
    2
    3
    4
    5
      
    {
    (parameters)->ReturnType in
    statements
    }

闭包表达式的优化过程
Swift 标准库中提供了名为sort的方法对数组进行排序,sort方法接受一个闭包函数作为参数,下面提供通过函数排序的代码:

1
2
3
4
5
6
  
let numbers = [1,4,3,5,8,7,6,2]
func compare(a:Int,b:Int)->Bool{
return a < b
}
numbers.sort(compare) //numbers = [1,2,3,4,5,6,7,8]

下面把函数换成闭包:

1
2
3
4
5
6
7
  
let numbers = [1,4,3,5,8,7,6,2]
numbers.sort({
(a:Int ,b:Int)->Bool in
return a < b
})
//numbers = [1,2,3,4,5,6,7,8]

由于Sort函数可以推断出闭包函数的参数类型和返回值类型为(Int,Int)->Bool,所以闭包表达式可以简化为(语法优化1):

1
2
3
4
    
let numbers = [1,4,3,5,8,7,6,2]
numbers.sort({a,b in return a < b})
//numbers = [1,2,3,4,5,6,7,8]

由语法优化2 还可以进一步优化代码:

1
2
3
4
    
let numbers = [1,4,3,5,8,7,6,2]
numbers.sort({a,b in a < b})
//numbers = [1,2,3,4,5,6,7,8]

Swift自动为内联函数闭包提供参数缩写功能,可以直接通过 $0, $1, $2... 来顺序调用闭包的参数,如果在闭包表达式中使用参数名称缩写,可以在闭包参数列表中省略对其的定义,并且对应参数名称缩写的类型会通过函数类型进行推断。 in 关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成(语法优化3):

1
2
3
    
let numbers = [1,4,3,5,8,7,6,2]
numbers.sort({ $0 < $1 })//numbers = [1,2,3,4,5,6,7,8]

尾随闭包
如果一个函数的最后一个参数是一个闭包函数类型,为了简化代码可以使用尾随闭包,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    
func functionWithClosure(closure:(Int,Int)->Int){
print(closure(2,3))
}
//调用函数
functionWithClosure(){
return $0 + $1 //打印出 5
}
//如果函数只需要闭包表达式一个参数可以把 () 去掉
functionWithClosure{
$0 + $1 //打印出 5
}
//sort函数也可以写成这样
let numbers = [1,4,3,5,8,7,6,2]
numbers.sort(){ $0 < $1 }

写这篇文章的目的主要是为了巩固一下闭包的知识,因为在实际写代码的时候老是对闭包的语法模糊不清,如有错误之处,还望批评指正。

Lei.Pan wechat
subscribe to my blog by scanning my public wechat account
万一有人想不开呢?