swift - Swift中zip、reduce和combination的解释
问题描述
有人可以为我分解这个代码示例吗?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
解决方案
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
从 的上一次迭代中获取值reduce
。 scores.0
引用元组中的第一个值,并scores.1
引用元组中的第二个值。初始runningTotal
值0
是传递给 的reduce
。
如果第一个分数更高,则combine
关闭返回runningTotal
加号,否则返回加号。然后将该值与下一个元组一起作为新值传递给下一次调用。1
0
combine
runningTotal
scores
最终结果是对第一个分数较高的分数进行计数。
推荐阅读
- c# - 如何通过主调用使 ac# 库不可见?
- azure-keyvault - DataProtectionBuilder.ProtectKeysWithAzureKeyVault 在 .net 4.7.2 中不起作用
- linker - 如何在 lli (LLVM) 中使用 I Address Sanitizer
- rest - api rest中2xx和4xx状态码之间的困境
- c++ - 使用 RTTI(或返回类型标签的虚函数)是否可以?
- ios - 如何在新设备中以编程方式禁用 Haptic Vibrate
- client-server - 服务器可以告诉客户端刷新页面吗?
- javascript - Ajax 调用后无法访问新元素(Vanilla JS)
- dart - 更改状态栏颜色仅适用于某些页面
- php - 为什么无法访问 Ajax 成功响应