目录
Swift编程里面的闭包(Closure),是自包含的函数代码块,可以在代码中被传递和引用,可以捕获和存储所在上下文中任意的常量和变量的引用,被称为包裹常量和变量。
1.闭包的表达式
{ (parameters) -> return type in
statements
}
以系统的sorted函数举例,sorted(by:)
var names = ["a张三","c李四","b小米"]
//定义一个闭包函数
func JPmethod(_ s1:String,_ s2:String) -> Bool{
return s1 > s2
}
var results = names.sorted(by:JPmethod)//传入函数名称
print(results)
sorted函数的参数就是一个闭包,如上面就是定义了一个闭包,然后再传入,不直接定义闭包的话,可以直接在参数里面写闭包也是可以的
var names = ["a张三","c李四","b小米"]
var results = names.sorted(by: {(_ s1:String,_ s2:String) -> Bool in
return s1 > s2
})
print(results)
2.根据上下文推断类型
闭包作为参数传递给方法,Swift可以推断出它的参数类型以及它返回的值的类型,这意味着不需要将类型作为闭包表达式定义的一部分来编写。因为可以推断出所有类型,所以也可以省略返回箭头(->)和参数名称周围的括号:
//根据上下文推断类型
var results1 = names.sorted(by: {s1,s2 in
return s1 > s2
})
3.单表达式隐式返回
单表达式闭包可以省略return关键字来隐式返回单个表达式的结果
var results1 = names.sorted(by: {(s1,s2) in
s1 > s2
})
4.简写参数名称
Swift自动提供内联闭包速记参数名,它可以使用的名称,指的是闭包的参数值1,$2,等等。
在闭包表达式中使用这些简写参数名称,则可以从其定义中省略闭包的参数列表,并且将从期望的函数类型推断缩写参数名称的数量和类型。in关键字也可以被省略
var results1 = names.sorted(by: {$0 > $1
})
5.运算符方法
var results1 = names.sorted(by: >)
6.尾随闭包
如果需要将一个很长的表达式最为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性
func jpClosure(closure:()->Void){
//函数体部门
}
//不使用尾随闭包进行函数调用
jpClosure(closure:{
//闭包体部分
})
//使用尾随闭包进行函数调用
jpClosure(){
}
如果提供闭包表达式作为函数或方法的唯一参数,并且将该表达式作为尾随闭包提供,则在调用函数时,不需要在函数或方法的名称后面写一对括号():
var results1 = names.sorted(by: {$0 > $1
})
7.总结
闭包Closure表达式是一种未命名的闭包,用轻量级语法编写,可以从上下文中捕获值。
Swift的闭包表达式具有干净,清晰的风格,闭包的优势包括:
- 从上下文中推断参数和返回值类型
- 单表达式闭包的隐式返回
- 速记参数名称
- 尾随闭包语法