1.闭包表达式语法
{ (参数) -> return 类型 in //内容 }
let names = ["C", "A", "E", "B", "D"] func back(_ s1: String, s2: String) -> Bool { return s1 > s2 //(B > A, C > B) }
//闭包后: var reversedNames.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 })
2.根据上下文推断类型
reversedNames = names.sorted(by: {s1, s2 in return s1 > s2}) //传入参数的类型确定,: String, : String可省略。传出参数的类型确定: -> Bool可省略
3.单表达式闭包的隐式返回
reversedNames = names.sorted(by: {s1, s2 in s1 > s2}) //只包含一个表达式,省略return之后无歧义,所以可以省略return。
4.参数名称缩写
reversedNames = names.sorted(by: {$0 > $1}) //可按照$0, $1, $2顺序调用闭包函数
5.运算符方法
reversedNames = names.sorted(by: >)
6.尾随闭包
将很长的闭包表达式作为最后一个参数传递给函数,不用写出他的参数标签。
func some(do: () -> Void) { //代码 } //不使用尾随闭包调用函数 some(do: { //代码 } //使用尾随闭包调用函数 some() { //语句 }
reversedNames = names.sorted() {$0 > $1} //sorted为函数的唯一方法时,可省略括号 reversedNames = names.sorted {$0 > $1}
7.值捕获
嵌套函数可捕获其外部函数所有参数、变量、常量。
8.逃逸闭包
当一个闭包作为一个参数传到一个函数中,但闭包在函数返回之后才被执行,则称闭包逃逸。
标注@escaping,表示允许闭包逃逸。
var comp: [() -> Void] = [] func some(comp1: @escaping () -> Void) { comp.append(comp1) }
9.自动闭包
包装传递给函数作为参数的表达式。不接受参数,只返回值。
延迟求值。直到调用这个闭包,代码才被执行。
var cuL = ["C", "A", "E", "B", "D"] print(cuL.count) //5 let cuP = {cuL.remove(at: 0)} print(cuL.count) //5。闭包未运行 cuP() //调用闭包 print(cuL.count) //4。闭包已运行,第一个值被删除。
标签:闭包,s2,s1,iOS,names,sorted,reversedNames,Swift From: https://www.cnblogs.com/lysboke/p/17657400.html