Swift 闭包
封面图
•
2025-10-20
•
Swift
0
0
0
0
在 **Swift** 中,**闭包(Closure)** 是一种可以被赋值给变量或常量、作为参数传递给函数、或者从函数中返回的匿名函数。它类似于其他语言中的“lambda 表达式”或“函数字面量”。 --- ## 一、闭包的基本语法 ### 1. 基本形式 ```swift { (参数) -> 返回类型 in // 执行代码 } ``` 例如: ```swift let add = { (a: Int, b: Int) -> Int in return a + b } print(add(2, 3)) // 输出 5 ``` --- ## 二、闭包的简化写法 Swift 允许你省略一些语法细节。 ### 1. 省略参数类型(如果上下文能推断) ```swift let add = { (a, b) in return a + b } ``` ### 2. 省略 `return` 关键字(如果只有一行表达式) ```swift let add = { (a, b) in a + b } ``` ### 3. 使用 `$0`, `$1` 等简写参数名 ```swift let add = { $0 + $1 } ``` --- ## 三、作为函数参数传递 你可以将闭包作为函数参数传入。 ### 示例:使用 `map` 函数 ```swift let numbers = [1, 2, 3, 4] let squared = numbers.map { $0 * $0 } print(squared) // 输出 [1, 4, 9, 16] ``` --- ## 四、尾随闭包(Trailing Closure) 如果闭包是函数的最后一个参数,可以将其放在括号外面。 ### 示例: ```swift func doSomething(with closure: () -> Void) { closure() } doSomething { print("闭包执行了") } ``` --- ## 五、逃逸闭包(Escaping Closure) 当闭包在函数返回后仍被调用时,需要使用 `@escaping` 标记。 ### 示例: ```swift var completionHandlers: [() -> Void] = [] func performTask(completion: @escaping () -> Void) { completionHandlers.append(completion) } performTask { print("任务完成") } // 在之后调用 completionHandlers[0]() // 输出 "任务完成" ``` --- ## 六、自动闭包(Autoclosure) 自动闭包会自动将表达式转换为闭包。 ### 示例: ```swift func logIf(condition: Bool, message: @autoclosure () -> String) { if condition { print(message()) } } logIf(condition: true, message: "Hello") // 输出 "Hello" ``` --- ## 七、捕获列表(Capture List) 在闭包中引用外部变量时,可能会导致强引用循环(retain cycle),可以使用 `[weak self]` 或 `[unowned self]` 来避免。 ### 示例: ```swift class MyClass { var value = 10 func start() { DispatchQueue.main.async { [weak self] in self?.value = 20 } } } ``` --- ## 八、常见用途 - 高阶函数(如 `map`, `filter`, `reduce`) - 异步回调(如网络请求、定时器) - 自定义排序、过滤逻辑 - UI 事件处理(如按钮点击) --- ## 九、总结 | 特性 | 说明 | |------|------| | 闭包 | 匿名函数,可赋值、传递、返回 | | 尾随闭包 | 最后一个参数可放在括号外 | | 逃逸闭包 | 使用 `@escaping` 标记 | | 自动闭包 | 使用 `@autoclosure` | | 捕获列表 | 避免强引用循环 | --- 如果你有具体应用场景(比如在 `map` 中使用闭包、异步处理等),我可以提供更详细的示例。
上一篇:
Swift 函数
标题录入,一次不能超过6条
返回顶部
留言
留言
评论