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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:39:51