You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:36:44