Swift 快速减少数组中的元组

Swift 快速减少数组中的元组,swift,Swift,是否有一种方法可以调用元组数组上的reduce函数来查找最大值 比如说 struct Gate{ var maxedOpenGates = 1 var GatesOpen : [(openOrdered : Int, gateNum : Int )] = [] init(defaultSelected : Int = 0){ GatesOpen.append(openOrdered : 1, gateNum : defaultSelected)

是否有一种方法可以调用元组数组上的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)
    }
}

是的,您可以像任何其他数组一样减少元组数组。 combine函数的参数是数组的元素,在 案例“门元组”。如果减少数组的结果也应该是门元组,那么初始元素和combine函数的结果 也必须是该类型:

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

使用带有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;
//查找打开时间最长的门////
设intitalValue=(Int.min,Int.min)
让lastGate:(openOrdered:Int,gateNum:Int)=gatespen.reduce(intitalValue){
(longestOpenGate:(openOrdered:Int,gateNum:Int),gate)在
if(longestOpenGate.openOrdered
或者

let lastGate:(openOrdered:Int,gateNum:Int)=gatespen.reduce(intitalValue){
$0.openOrdered<$1.openOrdered?$1:$0
}
让lastGateNumber=lastGate.gateNum;
将元组数组缩减为数组:
我发现
dropFirst(gatespen)
比手动切片操作好一点。如果您想用一个可选参数来解释空数组的可能性,那么可以使用
first.map
在数组为空时返回
nil
let lastGate=gatesOpen.first.map{fst in dropFirst(gatesOpen).reduce(fst){$0.openOrdered
@AirspeedVelocity:dropFirst的好主意我还考虑过处理一个空数组(你的建议非常优雅!),但是从给定的代码来看,似乎至少有一个“门”,所以我不想让事情复杂化。谢谢你的反馈。非常好!上面的解释和示例的补充极大地帮助我理解reduce函数和其他模拟这种设计的函数。您能否演示如何使用别名代替
$0
/
$1
?@javadba
{acculator,element in…}
Thx。
.0
$1.0
中是什么意思?0$,1$表示第一个和第二个闭包元素,.0和.1表示闭包元素中的第一个和第二个项目。这是标准的swift语法tho。✌️
let lastGate = dropFirst(gatesOpen).reduce(gatesOpen[0]) {
    $0.openOrdered < $1.openOrdered ? $1 : $0
}
 //////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;
let arr:[Int] = [(0,""),(1,"")].reduce([]) { $0 + [$1.0] }//Ouput:[0, 1]