相同回调实现下如何抽象函数调用?以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
相关产品推荐
相关产品推荐

