Swift减少一系列元组

时间:2015-04-22 04:46:22

标签: swift

有没有办法可以在元组数组上调用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

进行缩减
 let lastGate = GatesOpen.reduce(Int.min,{ max($0,$1) })

3 个答案:

答案 0 :(得分:4)

是的,您可以像任何其他数组一样减少元组数组。 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 :(得分: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;

答案 2 :(得分:1)

将元组数组简化为数组:

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