[swift]闭包的简写

一、闭包的完整格式

   {(parameters) -> return type in    // 闭包的类型描述
       statements                     // 闭包体
   }

二、 闭包简写的几个依据

1.闭包可更具上下文推断参数和返回值的类型

  • 如果闭包没有参数,那么in和之前的描述可以省略。

2.从单行表达式闭包中隐式返回(也就是闭包体只有一行代码,可以省略return)

3.可以简化闭包的参数名,如$0,$1(从0开始,表示第i个参数...)

  • 结合第一点,就是即使闭包有参数,使用简化参数名,那么in和之前的描述可以省略。

4.提供尾随闭包语法(Trailing closure syntax)

  • 4.1如果传入的参数,最后一个参数是闭包,那么可以把闭包放在()外面
  • 4.2如果传入的参数只有一个,且是一个闭包,那么这个()可以省略

三、结合具体案例分析

  • 1.sort函数(排序函数)
let names = ["g","b","a", "c", "d", "f"]

// 传入闭包(完整写法)
names.sort({ (num1, num2) -> Bool in
    return num1 > num2
})

// 简写1 (依据上面第4点)
// 4.1
names.sort(){ (num1, num2) -> Bool in
    return num1 > num2
}
// 4.2
names.sort{ (num1, num2) -> Bool in
    return num1 > num2
}

// 简写1(依据上面第2.4点)
names.sort{ (num1, num2) -> Bool in
    num1 > num2
}

// 简写2(依据上面第1.3.4点)
names.sort{ return $0 > $1 }

// 简写3(依据上面的1.2.3.4点)
names.sort{ $0 > $1 }

// 简写4(这不属于闭包的简写,是sort函数的简写)
names.sort(>)
names.sort(<)
names.sort()     // 排序函数(默认从小到大)

2.reduce函数 (归整函数)

var numbers = [1, 2, 3]
// numbers.reduce(initial: T, combine: (T, Int) throws -> T)
// 传入了两个参数,最后一个参数是一个闭包
// 完整的写法
let result = numbers.reduce( 10 , { (sum, elemt) -> Int in
   return sum + elemt
})

// 简写1(依据上面的第4点)
let result01 = numbers.reduce(10) { (sum, elemt) -> Int in
    return sum + elemt
}
// 最终简写 (依据上面的1.2.3.4点)
let result02 = numbers.reduce(10) {$0 + $1}

你可能感兴趣的:([swift]闭包的简写)