返回

Swift 中的闭包操作指南

IOS

闭包简介

闭包(Closures)是自包含的功能代码块,可以在代码中使用或作为参数传值。它们与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。全局函数和嵌套函数实际上都是特殊的闭包。

闭包的语法

闭包的语法如下:

{ (parameters) -> return type in
    // 闭包体
}

例如,以下闭包计算两个数的和:

let sum = { (a: Int, b: Int) -> Int in
    return a + b
}

闭包的用法

闭包可以作为函数参数、作为返回值、或者存储在变量中。

作为函数参数

闭包可以作为函数参数传递。例如,以下函数接受一个闭包作为参数,并调用该闭包计算两个数的和:

func calculateSum(operation: (Int, Int) -> Int) -> Int {
    return operation(10, 20)
}

let result = calculateSum(operation: sum)
print(result) // 输出:30

作为返回值

闭包也可以作为函数的返回值。例如,以下函数返回一个闭包,该闭包计算两个数的和:

func createSumOperation() -> (Int, Int) -> Int {
    return { (a: Int, b: Int) -> Int in
        return a + b
    }
}

let sumOperation = createSumOperation()
let result = sumOperation(10, 20)
print(result) // 输出:30

存储在变量中

闭包可以存储在变量中。例如,以下代码将闭包 sum 存储在变量 operation 中:

let operation = { (a: Int, b: Int) -> Int in
    return a + b
}

let result = operation(10, 20)
print(result) // 输出:30

闭包的类型推断

Swift 可以自动推断闭包的类型。例如,以下代码中的闭包 sum 的类型为 (Int, Int) -> Int

let sum = { (a, b) in
    return a + b
}

闭包的尾随闭包语法

Swift 提供了尾随闭包语法,可以将闭包作为函数的最后一个参数,并将其写在函数名后面,用一对括号括起来。例如,以下代码中的闭包 sum 作为函数 calculateSum 的最后一个参数,并写在函数名后面,用一对括号括起来:

func calculateSum(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int {
    return operation(a, b)
}

let result = calculateSum(10, 20) { (a, b) -> Int in
    return a + b
}

print(result) // 输出:30

闭包的逃逸

当闭包在函数返回后仍然被使用时,就发生了闭包逃逸。例如,以下代码中的闭包 sum 在函数 calculateSum 返回后仍然被使用,因此发生了闭包逃逸:

func calculateSum(_ a: Int, _ b: Int, completion: @escaping (Int) -> Void) {
    DispatchQueue.global().async {
        let result = a + b
        completion(result)
    }
}

calculateSum(10, 20) { result in
    print(result) // 输出:30
}

在上面的代码中,闭包 completion 被标记为 @escaping,表示它可以逃逸出函数 calculateSum

闭包的捕获列表

闭包可以捕获其周围作用域中的变量。这些变量称为闭包的捕获列表。例如,以下代码中的闭包 sum 捕获了变量 ab

let a = 10
let b = 20

let sum = {
    return a + b
}

print(sum()) // 输出:30

在上面的代码中,闭包 sum 在其周围作用域中捕获了变量 ab。这使得闭包可以在其定义的作用域之外使用这些变量。

结论

闭包是 Swift 中一种强大的工具,可以让你编写出更灵活、更简洁的代码。本文介绍了闭包的基础概念和用法,希望你能学以致用,在你的项目中使用闭包来提高代码质量和开发效率。