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

Swift中reduce函数的combine参数为何可以直接传入*作为闭包?

Swift 中传入*作为闭包参数的运行原理

问题涉及的代码片段如下:

// 自定义Array的reduce扩展
extension Array {
    func reduce<T>(_ initial: T, combine: (T, Element) -> T) -> T {
        var result = initial
        for x in self {
            result = combine(result, x)
        }
        return result
    }
}

// 用reduce计算整数数组乘积
func productUsingReduce(integers: [Int]) -> Int {
    return integers.reduce(1, combine: *)
}

原理说明

这种写法成立的核心逻辑是:Swift 中的所有运算符本质都是符合特定签名的全局函数,只要函数签名和参数要求的闭包签名完全匹配,就可以直接把运算符作为参数传入,不需要额外写完整的闭包表达式。
具体匹配逻辑拆解:

  • Int类型的乘法运算符*的内置签名为(Int, Int) -> Int:接收两个Int入参,返回两个数的乘积结果
  • 当对[Int]数组调用reduce方法时,数组的元素类型Element是Int,初始值传入的1也是Int类型,所以reduce方法的泛型T会被自动推导为Int,此时combine参数要求的签名正好是(Int, Int) -> Int,和*运算符的签名完全一致
  • 直接传入*的效果和写完整闭包{ a, b in a * b }完全等价,只是语法层面的简化,底层执行时还是会调用乘法运算符对应的函数完成计算

类似的简化用法非常常见,比如对整数数组做升序排序时可以写array.sorted(by: <),就是利用了<运算符的签名(Int, Int) -> Bool和sorted方法的by参数要求的签名完全匹配的特性。

内容的提问来源于stack exchange,提问作者Nighthawk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:36:00