swift 闭包知识详解
时间: 2023-07-06 14:20:04 浏览: 85
Swift 中的闭包是一个自包含的函数代码块,可以在代码中被传递和使用。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。Swift 中的闭包类似于 C 和 Objective-C 中的 blocks、以及其他一些编程语言中的 lambdas。
闭包有以下三种形式:
1. 全局函数,有名字但不能捕获任何值。
2. 嵌套函数,有名字,也能捕获其封闭函数内的值。
3. 闭包表达式,没有名字,使用轻量级语法,可以捕获上下文中的值。
闭包表达式的基本语法如下:
```
{ (parameters) -> return type in
statements
}
```
其中 `parameters` 为参数列表,可以为空;`return type` 为返回类型,也可以为空;`statements` 为闭包体,包含了要执行的代码。
例如,下面的代码定义了一个接受两个整数参数并返回它们之和的闭包:
```
let sum = { (a: Int, b: Int) -> Int in
return a + b
}
```
可以像函数一样调用这个闭包:
```
let result = sum(1, 2)
print(result) // 输出 3
```
闭包可以作为函数的参数或返回值。例如,下面的代码定义了一个接受一个整型数组和一个闭包参数的函数 `apply`:
```
func apply(_ array: [Int], _ transform: (Int) -> Int) -> [Int] {
var result = [Int]()
for element in array {
result.append(transform(element))
}
return result
}
```
可以使用闭包表达式作为 `transform` 参数传递:
```
let numbers = [1, 2, 3, 4, 5]
let squared = apply(numbers, { (number) -> Int in
return number * number
})
print(squared) // 输出 [1, 4, 9, 16, 25]
```
闭包还支持尾随闭包语法,可以将闭包表达式作为函数的最后一个参数传递,并将其放在圆括号之外。例如,上面的代码也可以写成:
```
let squared = apply(numbers) { (number) -> Int in
return number * number
}
```