闭包是自包含的函数代码块,可以在代码中被传递和使用。
Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。
闭包可以捕获和存储其所在上下文中任意常量和变量的引用。
1 闭包表达式(Closure Expressions)
1 | // sorted 方法(The Sorted Method) |
闭包表达式语法:1
2
3
4{ (parameters) -> returnType in
statements
}
关键字`in`表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。
1 | var reversedNames2 = names.sorted(by: {(s1:String, s2:String) -> Bool in return s1>s2}) |
根据上下文推断类型(Inferring Type From Context)
1 | var reversedNames3 = names.sorted(by: {(s1, s2)->Bool in return s1>s2}) |
根据上下文推断类型(Inferring Type From Context) 省略 return 和 返回值
1 | var reversedNames4 = names.sorted(by: {(s1, s2) in s1>s2}) |
参数名称缩写(Shorthand Argument Names):直接通过 $0 , $1 , $2 来顺序调用闭包的参数
1 | var reversedNames5 = names.sorted(by: {$0>$1}) |
运算符方法(Operator Methods)
1 | var reversedNames6 = names.sorted(by: >) |
2 尾随闭包(Trailing Closures):将一个很长的闭包表达式作为最后一个参数传递给函数
不使用尾随闭包进行函数调用:
1 | func someFunctionThatTakesAClosure(closure: { |
使用尾随闭包进行函数调用:
1 | func someFunctionThatTakesAClosure() { |
1 | var reversedNames7 = names.sorted(){$0>$1} |
3 值捕获(Capturing Values)
闭包可以在其被定义的上下文中捕获常量或变量。即使定义这些常量和变量的原作用域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。
嵌套函数 是 捕获值的闭包的最简单形式
1 | func makeIncrementer(forIncrement amount: Int) -> () -> Int { |
4 闭包是引用类型(Closures Are Reference Types)
// 函数和闭包都是引用类型
// 无论将函数或闭包赋值给一个常量还是变量,实际上都是将常量或变量的值设置为对应函数或闭包的引用。
1 | let funcbyTen = funcby10 |
逃逸闭包(Escaping Closures)
自动闭包(Autoclosures)
playground文件在andyRon/LearnSwift