Swift 闭包表达式

56 阅读2分钟

闭包表达式(Closure Expression)

  • 在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数
  1. 用func定义一个函数
func sum(_ v1:Int,_ v2:Int) -> Int{v1 + v2}
  1. 用闭包表达式定义一个函数
{
    (参数列表) -> 返回值类型  in  函数体代码
}
var fn = {(v1:Int,v2:Int) -> Int in return v1 + v2}
fn(10,20) // 30

闭包表达式的简写

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
})

尾随闭包

  • 如果将一个很长的闭包表达式作为函数的最后一个实参,使用尾随闭包可以赠钱函数的可读性
  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()
}
// 如果第一个数大于0,后面闭包表达式根本就没必要调用
getFirstPositive(10,{
    let a = 10
    let b = 11
    print("test---")
    return a + b
})