闭包表达式(Closure Expression)
- 在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数
- 用func定义一个函数
func sum(_ v1:Int,_ v2:Int) -> Int{v1 + v2}
- 用闭包表达式定义一个函数
{
(参数列表) -> 返回值类型 in 函数体代码
}
var fn = {(v1:Int,v2:Int) -> Int in return v1 + v2}
fn(10,20)
闭包表达式的简写
func exec(v1:Int,v2:Int,fn:(Int,Int) -> Int){
print(fn(v1,v2))
}
exec(v1:10,v2:20,fn:{
(v1:Int,v2:Int) -> Int in return v1 + v2
})
exec(v1:10,v2:20,fn:{
v1,v2 in return v1 + v2
})
exec(v1:10,v2:20,fn:{
v1,v2 in v1+ v2
})
exec(v1:10,v2:20,fn:{
$0 + $1
})
尾随闭包
- 如果将一个很长的闭包表达式作为函数的最后一个实参,使用尾随闭包可以赠钱函数的可读性
- 尾随闭包是一个被书写在函数调用括号外面(后面)的闭包表达式
func exec(v1:Int,v2:Int,fn:(Int,Int) -> Int){
print(fn(v1,v2))
}
exec(v1:10,v2:20){
$0 + $1
}
- 如果闭包表达式是函数的唯一实参,而且使用了尾随闭包的语法,那就不需要在函数名后边写圆括号
func exec(fn:(Int,Int) ->){
print(fn(1,2))
}
exec(fn:{$0 + $1})
exec(){$0 + $1}
exec{$0 + $1}
自动闭包 @autoclosure
如果第一个数大于0,返回第一个数。否则返回第二个数
func getFirstPositive(_ v1:Int,_ v2:@autoclosure () -> Int ) -> Int {
return v1 > 0 ? v1 : v2()
}
getFirstPositive(10,{
let a = 10
let b = 11
print("test---")
return a + b
})