定义区别
- 函数:是一段有名字的可执行代码块,使用
func
关键字定义,有明确的参数列表和返回值类型声明。
func addNumbers(a: Int, b: Int) -> Int {
return a + b
}
- 闭包:是一个自包含的代码块,可以在代码中传递和使用。有三种形式,全局函数是一种不捕获任何值的闭包,嵌套函数是可以捕获其封闭函数内变量的闭包,而闭包表达式是一种轻量级语法构建内联闭包。
let closure = { (a: Int, b: Int) -> Int in
return a + b
}
使用场景区别
- 函数:适用于定义可复用的、有明确功能和命名的代码块,一般在整个程序中多处调用。例如,计算两个数之和这样通用的功能。
let result1 = addNumbers(a: 3, b: 5)
print(result1)
- 闭包:常用于需要将一段代码作为参数传递给其他函数的场景,例如
map
、filter
、sorted
等高阶函数。也用于延迟执行代码。
let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { $0 * $0 }
print(squaredNumbers)
捕获变量区别
- 函数:通常不捕获外部变量,除非在函数内部定义了静态变量。函数参数和局部变量在函数调用结束后通常会被释放。
func increment() {
var count = 0
count += 1
print(count)
}
increment()
- 闭包:可以捕获其定义时所在作用域中的变量,即使这些变量在闭包定义之后超出了其原始作用域,闭包捕获的变量依然可以被访问和修改。
func makeIncrementer() -> () -> Int {
var count = 0
let incrementClosure: () -> Int = {
count += 1
return count
}
return incrementClosure
}
let incrementer = makeIncrementer()
print(incrementer())
print(incrementer())