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

相同回调实现下如何抽象函数调用?以Swift异步函数为例

用高阶函数封装重复的回调逻辑

这问题太常见啦!既然doSomethingWithFoo和doSomethingWithBar的核心差异只是调用的目标函数不同,而回调处理逻辑完全一致,我们可以用高阶函数来把重复的代码抽离出来,让代码更简洁易维护。

方案:封装通用执行函数

我们先写一个通用的函数,它负责接管统一的回调处理,同时接受一个“任务闭包”——这个闭包的作用就是去调用具体的请求函数(比如foo或bar):

// 通用执行函数:接管统一的回调逻辑,接受一个任务闭包
func executeRequest(with task: @escaping (@escaping (Response) -> Void) -> Void) {
    task { response in
        // 这里放统一的回调处理逻辑,不用重复写
        handleResponse(response)
    }
}

然后修改原来的两个函数,让它们调用这个通用函数:

func doSomethingWithFoo() {
    // foo的参数正好匹配task的类型,直接传即可
    executeRequest(with: foo)
}

func doSomethingWithBar() {
    // bar多了一个a参数,我们用闭包包装一下,固定参数后再传递
    executeRequest(with: { completion in
        bar(a: 42, completion: completion)
    })
}

为什么这么做?

  • 统一的回调逻辑只需要写一次,后续如果要修改handleResponse的逻辑,只改executeRequest里的代码就行,不用逐个修改所有请求函数的调用处。
  • 新增类似的请求调用时,只需要用同样的方式包装目标函数,比如如果有baz(b: String, completion: ...),只需要写:
    func doSomethingWithBaz() {
        executeRequest(with: { completion in
            baz(b: "hello", completion: completion)
        })
    }
    

这种方式完美贴合Swift的闭包特性,既保留了代码的可读性,又彻底消除了重复逻辑。

内容的提问来源于stack exchange,提问作者Faiçal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:26:36