Swift缩小一个元组数组

7
有没有一种方法可以在元组数组上调用reduce函数来查找最大值?
例如:
struct Gate{

    var maxedOpenGates = 1

    var GatesOpen : [(openOrdered : Int, gateNum : Int )] = []

    init(defaultSelected : Int = 0){

        GatesOpen.append(openOrdered : 1, gateNum : defaultSelected)
    }

    private func manipulateGates(gates : [SegmentButton]){
        for i in GatesOpen{
            gates[i.gateNum].toggleSelected()
        }

    }

    mutating func openGate(index : Int, buttons : [SegmentButton]){

        if GatesOpen.count < maxedOpenGates{
            GatesOpen.append(  openOrdered: GatesOpen.count , gateNum: index)

        }else{
         //////Finding the gate that was Opened the longest////
            let lastGate = GatesOpen.reduce(Int.min,{ max($0,$1) })

        }
        manipulateGates(buttons)
    }
}

我试图根据openOrdered来减少A。

 let lastGate = GatesOpen.reduce(Int.min,{ max($0,$1) })
3个回答

5

是的,您可以像处理其他数组一样减少元组数组。

combine 函数的参数是数组的元素,对于您的情况是“门元组”。如果将数组减少的结果也应该是门元组,则初始元素和 combine 函数的结果也必须是该类型。

let lastGate = gatesOpen.reduce(gatesOpen[0]) {
        $0.openOrdered < $1.openOrdered ? $1 : $0
}

当然,为了使其有效,数组必须至少有一个元素。为避免无意义地将gatesOpen [0]与自身进行比较,您可以将其更改为(在@Airspeed的评论后进行编辑):

let lastGate = dropFirst(gatesOpen).reduce(gatesOpen[0]) {
    $0.openOrdered < $1.openOrdered ? $1 : $0
}

1
我发现 dropFirst(gatesOpen) 比手动切片操作更好。如果你想要考虑到空数组的情况,可以使用 first.map 来返回 nillet lastGate = gatesOpen.first.map { fst in dropFirst(gatesOpen).reduce(fst) { $0.openOrdered < $1.openOrdered ? $1 : $0 } } - Airspeed Velocity
@AirspeedVelocity:dropFirst 是个好主意。- 我也考虑过处理空数组(你的建议非常优雅!),但从给定的代码中,我觉得至少有一个“门”,所以我不想把事情搞复杂。感谢反馈。 - Martin R
非常好!上面的解释,再加上例子,极大地帮助了我理解reduce函数和其他模仿这种设计的函数。 - MooCow

3
使用reduce函数的闭包:
 //////Finding the gate that was Opened the longest////
let intitalValue = (Int.min,Int.min)
let lastGate: (openOrdered: Int, gateNum: Int) = GatesOpen.reduce(intitalValue){
         (longestOpenGate: (openOrdered: Int, gateNum: Int), gate) in
          if(longestOpenGate.openOrdered < gate.openOrdered) {
                  return gate;
          } else {
                  return longestOpenGate;
          }

}
let lastGateNumber = lastGate.gateNum;

或者,

let lastGate: (openOrdered: Int, gateNum: Int) = GatesOpen.reduce(intitalValue){
   $0.openOrdered < $1.openOrdered ? $1 : $0
}
let lastGateNumber = lastGate.gateNum;

3

将元组数组化简为数组:

let arr:[Int] = [(0,""),(1,"")].reduce([]) { $0 + [$1.0] }//Ouput:[0, 1]

你能演示如何使用别名来代替 $0 / $1 吗? - WestCoastProjects
@javadba { 累加器, 元素... } - Sentry.co
谢谢。在 $1.0 中,.0 是什么意思? - WestCoastProjects
0$,1$ 表示第一个和第二个闭包元素,.0 和 .1 表示闭包元素中的第一个和第二个项目。这是标准的 Swift 语法。✌️ - Sentry.co

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接