Swift 4中如何实现保留参数标签/名称的函数柯里化?
在Swift 4中实现保留参数标签的函数柯里化
你说得没错,Swift 4里没有原生支持带参数标签的柯里化工具,普通的curry实现确实会丢失参数名。不过有两种方案可以完美解决这个问题,完全贴合你的需求:
方案一:手动柯里化特定函数
对于固定参数的函数,手动编写柯里化版本是最直接且可靠的方式,能100%保留原函数的参数标签。以你的doSomething为例:
// 原函数 func doSomething(a: A, b: B, c: C) { // 你的函数逻辑 } // 手动实现的柯里化版本 func curryDoSomething(a: A) -> (b: B) -> (c: C) -> Void { return { bValue in return { cValue in doSomething(a: a, b: bValue, c: cValue) } } } // 使用方式完全符合预期 let do_a = curryDoSomething(a: value_a) let do_ab = do_a(b: value_b) do_ab(c: value_c)
这种方式的好处是完全自定义,你可以根据原函数的参数标签来命名柯里化后每一步的参数,完全贴合你的使用习惯。
方案二:通用带参数标签的柯里化函数
如果需要给多个函数做柯里化,手动写太繁琐,可以定义泛型的curry函数,让它支持保留参数标签。要注意的是,Swift的参数标签是函数类型的一部分,所以我们需要针对不同参数个数的函数编写对应的curry实现。
比如针对三参数带a/b/c标签的函数:
func curry<T1, T2, T3, Result>( _ function: @escaping (a: T1, b: T2, c: T3) -> Result ) -> (a: T1) -> (b: T2) -> (c: T3) -> Result { return { a in return { b in return { c in function(a: a, b: b, c: c) } } } } // 使用示例 let curryDo = curry(doSomething) let do_a = curryDo(a: value_a) // 保留a标签 let do_ab = do_a(b: value_b) // 保留b标签 let result = do_ab(c: value_c) // 保留c标签
如果你的函数参数标签不是a/b/c,可以修改这个泛型函数的参数标签,让它匹配你的原函数。比如原函数是func process(x: Int, y: String, z: Bool),就把curry函数里的标签改成x/y/z即可。
总结
- 针对单个函数,优先选择手动柯里化,灵活性最高,能完全匹配你的参数标签需求。
- 针对多个同参数标签格式的函数,可以用泛型curry函数来减少重复代码。
内容的提问来源于stack exchange,提问作者tuledev
相关产品推荐
相关产品推荐

