回顾一下OC中闭包的使用:
闭包是自包含的函数代码块,可以在代码中被传递和使用; 函数和闭包都是引用类型;
闭包表达式
示例:对下面数组进行逆序排序
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
- 函数形式
func backward(_ s1: String, _ s2: String) -> Bool {
return s1 > s2
}
var reversedNames = names.sorted(by: backward)
// reversedNames 为 ["Ewa", "Daniella", "Chris", "Barry", "Alex"]
一旦它完成排序过程,sorted(by:) 方法会返回一个与旧数组类型大小相同类型的新数组,该数组的元素有着正确的排序顺序。原数组不会被 sorted(by:) 方法修改。
如果第一个字符串(s1 )大于第二个字符串(s2 ),backward(::) 函数会返回 true ,表示在新的数组中 s1 应该出现在 s2 前。对于字符串中的字符来说,“大于”表示“按照字母顺序较晚出现”。这意味着字母 "B" 大于字母 "A" ,字符串 "Tom" 大于字符串 "Tim" 。该闭包将进行字母逆序排序,"Barry" 将会排在 "Alex" 之前。
- 闭包表达式形式
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2
})
- 闭包表达式简写形式:写成一行代码
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )
- 闭包表达式简写形式:根据上下文推断类型
reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
- 闭包表达式简写形式:隐式返回
reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
- 闭包表达式简写形式:参数名称缩写
reversedNames = names.sorted(by: { $0 > $1 } )
- 闭包表达式简写形式:运算符方法
reversedNames = names.sorted(by: >)
- 闭包表达式简写形式:改写在 sorted(by:) 方法圆括号的外面
reversedNames = names.sorted() { $0 > $1 }
- 闭包表达式简写形式
如果闭包表达式是函数或方法的唯一参数,则当你使用尾随闭包时,可以把 () 省略掉
reversedNames = names.sorted { $0 > $1 }
尾随闭包
如果你需要将一个很长的闭包表达式作为最后一个参数传递给函数,此时该闭包属于尾随闭包,不用写出它的参数标签。
函数形式作为最后一个参数传递给函数
func someFunctionThatTakesAClosure(closure: () -> Void) {
// 函数体部分
}
普通闭包形式作为最后一个参数传递给函数
someFunctionThatTakesAClosure(closure: {
// 闭包主体部分
})
尾随闭包写法作为最后一个参数传递给函数
someFunctionThatTakesAClosure() {
// 闭包主体部分
}
值捕获
逃逸闭包
当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,称该闭包从函数中逃逸。 将一个闭包标记为 @escaping 意味着你必须在闭包中显式地引用 self 。