一、闭包的完整格式
{(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}
网友评论