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
相关产品推荐
相关产品推荐

