2015-04-22 21 views
5

Có cách nào để tôi có thể gọi hàm reduce trên một loạt các bộ dữ liệu để tìm giá trị tối đa không?Swift Giảm một loạt các bộ dữ liệu trong

Ví dụ

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) 
    } 
} 

nơi tôi đang cố gắng để giảm dựa trên openOrdered

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

Trả lời

4

Vâng, bạn có thể giảm một mảng của các bộ giống như bất kỳ mảng khác. Các đối số của hàm kết hợp là các phần tử của mảng, trong trường hợp "cổng tuples" của bạn. Và nếu kết quả của việc giảm mảng cũng phải là một tuple cổng thì yếu tố đầu tiên và kết quả của sự kết hợp chức năng cũng phải có kiểu đó:

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

Tất nhiên mảng phải có ít nhất một yếu tố để làm việc này. Để tránh sự so sánh không cần thiết của gatesOpen[0] với chính nó bạn có thể thay đổi nó để soạn thảo (sau @ bình luận tốc độ bay của):

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

Tôi tìm thấy 'dropFirst (gatesOpen)' là đẹp hơn một chút so với thao tác cắt thủ công. Nếu bạn muốn tính đến khả năng mảng trống với một tùy chọn, bạn có thể sử dụng 'first.map' để trả về' nil' nếu trống của mảng: 'let lastGate = gatesOpen.first.map {fst trong dropFirst (gatesOpen) .reduce (fst) { $ 0.openOrdered <$ 1.openOrdered? $ 1: $ 0 } } ' –

+0

@AirspeedVelocity: Ý tưởng hay với dropFirst. - Tôi cũng đã nghĩ đến việc xử lý một mảng trống (gợi ý của bạn rất tao nhã!), Nhưng từ đoạn mã đã cho tôi thấy có ít nhất một "cổng", vì vậy tôi không muốn làm phức tạp mọi thứ. Cảm ơn vì bạn đã phản hồi. –

+0

Rất đẹp! Lời giải thích ở trên, bổ sung cho các ví dụ giúp tôi hiểu rõ về chức năng giảm và các chức năng khác bắt chước thiết kế như vậy. – MooCow

3

Sử dụng đóng cửa với giảm chức năng,

//////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; 

Hoặc,

let lastGate: (openOrdered: Int, gateNum: Int) = GatesOpen.reduce(intitalValue){ 
    $0.openOrdered < $1.openOrdered ? $1 : $0 
} 
let lastGateNumber = lastGate.gateNum; 
Các vấn đề liên quan