reduce(_:_ :)函数在Swift中做什么?

问题描述 投票:2回答:5

这里是一段我不懂的代码。这段代码使用swift的reduce( :)函数以及我难以理解的闭包。 maxVerticalPipCountmaxHorizontalPipCount中设置的值是什么?它们分别是52吗?

let pipsPerRowForRank = [[0], [1], [1,1], [1,1,1], [2,2], [2,1,2], 
                            [2,2,2], [2,1,2,2], [2,2,2,2], [2,2,1,2,2], 
                            [2,2,2,2,2]]
let maxVerticalPipCount = CGFloat(pipsPerRowForRank.reduce(0) { max($1.count, $0) })
let maxHorizontalPipCount = CGFloat(pipsPerRowForRank.reduce(0) { max($1.max() ?? 0, $0) })
swift
5个回答
2
投票

这是reduce函数在这里所做的

var maxVerticalPipCount:CGFloat = 0
for rark in pipsPerRowForRank {
    if CGFloat(rark.count) > maxVerticalPipCount {
        maxVerticalPipCount = CGFloat(rark.count)
    }
}
var maxHorizontalPipCount:CGFloat = 0
for rark in pipsPerRowForRank {
    if CGFloat(rark.max() ?? 0) > maxHorizontalPipCount {
        maxHorizontalPipCount = CGFloat(rark.max() ?? 0)
    }
}

您不应该使用reduce(::)函数来找到最大值。使用max(by:) 函数是这样的>

let maxVerticalPipCount = CGFloat(pipsPerRowForRank.max { $0.count < $1.count }?.count ?? 0)
let maxHorizontalPipCount = CGFloat(pipsPerRowForRank.max { ($0.max() ?? 0) < ($1.max() ?? 0) }?.max() ?? 0)

2
投票

顺便说一句,如果您想知道reduce的确切含义,可以随时参考source code,在这里您可以看到实际的代码以及注释中的漂亮叙述。


1
投票

reduce函数循环遍历集合中的每个项目,并将它们组合为一个值。可以认为它实际上是将多个值减少为一个值。 [lazy]


1
投票

Reduce将数组中的所有数字加在一起会打开一个闭包,并实际上执行您告诉它返回的所有操作。


0
投票

使用Swift 5的示例,

let maxHorizontalPipCount = max(2, 0)
let maxHorizontalPipCount = max(3, 2)
let maxHorizontalPipCount = max(4, 3)
let maxHorizontalPipCount = max(0, 4)
let maxHorizontalPipCount = 4
© www.soinside.com 2019 - 2024. All rights reserved.