在Swift中使用嵌套的reduce

iOS*_*eek 4 arrays reduce functional-programming ios swift

我有一个包含数组的数组Double,如截图中所示:

在此输入图像描述

我的目标是获得Double每个数组元素乘法的总和.这意味着,我想将每个数组的所有元素相乘然后,在我的情况下,我将得到3个值,所以我得到它们的总和.

我想用reduce,flatMap?或任何优雅的解决方案

我试过了什么?

totalCombinations.reduce(0.0) { $0 + ($1[0]*$1[1]*$1[2])  }
Run Code Online (Sandbox Code Playgroud)

但只有当我知道包含双精度的数组的大小时,这才起作用.

Luc*_*tti 7

鉴于这些价值观

let lists: [[Double]] = [[1.1, 2.2, 3.3], [4.4, 5.5, 6.6]]
Run Code Online (Sandbox Code Playgroud)

让我们来看看几种可能的方法

解决方案#1

let sum =  lists.reduce(0) { $0 + $1.reduce(1, combine: *) }
Run Code Online (Sandbox Code Playgroud)

解决方案#2

如果您定义此扩展名

extension SequenceType where Generator.Element == Double {
    var product : Double { return reduce(1.0, combine: *) }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写

let sum = lists.reduce(0) { $0 + $1.product }
Run Code Online (Sandbox Code Playgroud)

解决方案#3

通过上面定义的扩展,您也可以编写

let sum = lists.map { $0.product }.reduce(0, combine:+)
Run Code Online (Sandbox Code Playgroud)

解决方案#4

如果我们定义这两个后缀运算符

postfix operator +>{}
postfix func +>(values:[Double]) -> Double {
    return values.reduce(0, combine: +)
}

postfix operator *>{}
postfix func *>(values:[Double]) -> Double {
    return values.reduce(1, combine: *)
}
Run Code Online (Sandbox Code Playgroud)

我们可以写

lists.map(*>)+>
Run Code Online (Sandbox Code Playgroud)