-2

有人可以为我分解这个代码示例吗?zip并且reduce有一定的意义,但是发生的事情combine:让我感到困惑。任何帮助将不胜感激。

let a = [5, 6, 7]
let b = [3, 6, 10]

let pointsAlice = zip(a, b).reduce(0, combine: { $0 + ($1.0 > $1.1 ? 1 : 0) } )
let pointsBob = zip(b, a).reduce(0, combine: { $0 + ($1.0 > $1.1 ? 1 : 0) } )

print("\(pointsAlice) \(pointsBob)") // 1 1
4

1 回答 1

1

zip(a, b)生成一个元组序列,将来自a和的值配对b

[(5, 3), (6, 6), (7, 10)]

该序列一次传递给reduce一个元组。 reduce接受两个参数。第一个是 的初始值,runningTotal第二个是一个名为的闭包combine,它对序列中的每个项目进行一次调用。

在这种情况下,代码会计算 Alice 和 Bob 得分较高的分数。

使用默认值$0,$1.0$1.1使代码有点难以解释,但这里有一个等效版本:

let pointsAlice = zip(a, b).reduce(0, combine: { (runningTotal, scores) in
    return runningTotal + (scores.0 > scores.1 ? 1 : 0) } )

对于序列中的每个值(例如(5, 3)),该值作为 传递给combine闭包scores,然后runningTotal从 的上一次迭代中获取值reducescores.0引用元组中的第一个值,并scores.1引用元组中的第二个值。初始runningTotal0是传递给 的reduce

如果第一个分数更高,则combine关闭返回runningTotal加号,否则返回加号。然后将该值与下一个元组一起作为新值传递给下一次调用。10combinerunningTotalscores

最终结果是对第一个分数较高的分数进行计数。

于 2019-08-16T15:30:07.757 回答