Swift的闭包(Closures)是一种将功能块和上下文整合并演示在代码中的一种手段。闭包可以捕获并存储其上下文中的变量和常量。与普遍存在于其他语言的匿名函数(如Python的lambda、JavaScript的函数表达式)类似,Swift的闭包提供了强大的功能,并在很多场景中替代了函数。
闭包有三种主要形式:
闭包表达式语法是构建闭包的一种方式,包含一个参数列表,一个返回类型和闭包的主体:
{ (parameters) -> returnType in
statements
}
让我们一步步通过示例探讨一下闭包的使用情形。
let simpleClosure = {
print("Hello, Swift Closure!")
}
simpleClosure() // 输出: "Hello, Swift Closure!"
let sumClosure = { (a: Int, b: Int) -> Int in
return a + b
}
let result = sumClosure(3, 5)
print(result) // 输出: 8
闭包经常作为参数传递给函数,比如用作回调函数。
func performOperation(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
return operation(a, b)
}
let result = performOperation(a: 10, b: 20, operation: { (x, y) -> Int in
return x * y
})
print(result) // 输出: 200
如果闭包是函数的最后一个参数,那么可以使用尾随闭包的语法来书写:
func performOperation(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
return operation(a, b)
}
let result = performOperation(a: 10, b: 20) { (x, y) -> Int in
return x * y
}
print(result) // 输出: 200
闭包可以捕获并存储其上下文中的变量值,这被称为“捕获”。
func makeIncrementer(incrementAmount: Int) -> () -> Int {
var total = 0
let incrementer: () -> Int = {
total += incrementAmount
return total
}
return incrementer
}
let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo()) // 输出: 2
print(incrementByTwo()) // 输出: 4
自动闭包是一种自动捕获表达式的闭包,多用于延时计算和副作用控制。
var array = [1, 2, 3]
func removeFirstElement(array: @autoclosure () -> Int?) -> Int? {
return array()
}
let firstElement = removeFirstElement(array: array.removeFirst())
print(firstElement ?? "Array is empty") // 输出: 1
当闭包在函数返回之后还被调用时,需要将其标记为@escaping
。
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
someFunctionWithEscapingClosure {
print("This is an escaping closure")
}
// 代码稍后执行
completionHandlers.first?() // 输出: "This is an escaping closure"
这些示例涵盖了Swift闭包的基础和一些高级场景。