Swift中如何用函数类型/闭包优化switch语句的重复逻辑?
解决方案:用Swift函数类型抽离重复逻辑
当然可以搞定!这正是Swift函数类型和闭包发挥作用的场景,能帮你把重复的前置/后置逻辑彻底抽离,只在switch里专注选择要调用的函数,代码瞬间清爽很多~
核心思路
把重复的「前置操作」「后置操作」和「统一的异步完成逻辑」从switch的case里拿出来,让switch只负责根据index匹配对应的目标函数,然后在外部统一执行这些重复逻辑 + 调用选中的函数。
具体实现步骤
首先,先给你的异步函数定义一个类型别名(让代码更易读):
// 定义完成闭包的类型 typealias CompletionHandler = () -> Void // 定义你的异步函数类型:接受一个完成闭包,无返回值 typealias AsyncAction = (@escaping CompletionHandler) -> Void
接下来,用switch只选择对应的函数:
// 根据index获取要执行的异步函数 let selectedAction: AsyncAction? switch index { case 0: selectedAction = myFuncCase_1 case 1: selectedAction = myFuncCase_2 default: selectedAction = nil }
最后,统一处理所有重复逻辑:
if let action = selectedAction { // 原来case里的「do some stuff」—— 统一前置逻辑 print("准备执行任务...") // 调用选中的异步函数,传入统一的完成闭包 action(onCompletion: { // 原来case里的「do some same async stuff」—— 统一异步完成逻辑 print("异步任务执行完成!") }) // 原来case里的「do some more same stuff」—— 统一后置逻辑 print("任务初始化完成,等待异步结果...") }
优化版:封装成函数更易维护
如果这个逻辑会被多次调用,把「选择函数」的逻辑封装成一个单独的函数会更方便:
func getAsyncAction(for index: Int) -> AsyncAction? { switch index { case 0: return myFuncCase_1 case 1: return myFuncCase_2 // 以后新增case,只需要在这里加一行就行 case 2: return myFuncCase_3 default: return nil } } // 调用的时候就超简洁 if let action = getAsyncAction(for: index) { // 前置逻辑 action(onCompletion: { // 统一完成逻辑 }) // 后置逻辑 }
为什么这个方案好用?
- 完全消除了重复代码,以后修改前置/后置逻辑只需要改一处
- 把「选择函数」和「执行逻辑」分离,符合单一职责原则,代码可读性更高
- 利用Swift的函数类型特性,天然支持这种“函数作为值传递”的场景
内容的提问来源于stack exchange,提问作者nets-rac
相关产品推荐
相关产品推荐

