在 Swift 中,闭包是一种自包含的函数代码块,可以捕获和存储其所在上下文中任意常量和变量的引用。闭包允许在函数内定义函数,也可以作为参数传递给其他函数或方法,还可以被作为函数的返回值。

以下是一些关于 Swift 闭包的基本信息和使用方法:

闭包的基本形式
// 闭包的最简形式,没有参数和返回值
let simpleClosure = {
    print("This is a simple closure.")
}

// 带参数和返回值的闭包
let addClosure: (Int, Int) -> Int = { (a, b) in
    return a + b
}

let result = addClosure(3, 4)  // 结果为 7

闭包的简化形式

如果闭包的类型已知,可以省略参数和返回值的类型,以及 return 关键字:
let simpleAddClosure = { a, b in
    a + b
}

let result = simpleAddClosure(3, 4)  // 结果为 7

尾随闭包

如果闭包是函数的最后一个参数,可以将闭包写在函数调用的括号外面,形成尾随闭包:
func performOperation(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int {
    return operation(a, b)
}

let result = performOperation(3, 4) { (a, b) in
    a + b
}

捕获值

闭包可以捕获并存储其所在上下文中的常量和变量的引用。这意味着即使定义这些常量和变量的作用域已经结束,闭包仍然可以引用和修改它们:
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

逃逸闭包

默认情况下,闭包是非逃逸的,意味着它们在函数结束时执行。如果希望闭包在函数返回后继续存在,可以使用 @escaping 关键字:
var closureArray: [() -> Void] = []

func escapingClosure(completion: @escaping () -> Void) {
    closureArray.append(completion)
}

escapingClosure {
    print("Closure is escaping.")
}

closureArray.first?()  // 调用逃逸闭包

以上是一些 Swift 闭包的基本用法。闭包在 Swift 中是非常强大和灵活的工具,用于实现函数式编程的特性。


转载请注明出处:http://www.zyzy.cn/article/detail/14425/Swift