2017-07-13 3 views
1

Ich habe eine Reihe von Herzfrequenz. Alles, was ich will, ist ein Durchschnitt von 5 Minuten Herzfrequenz. (Das Array enthält mehr als die Herzfrequenz der letzten Stunde).Swift reduzieren Funktion Ausgabe

class HeartRate 
{ 
    var hr = 0 
    var date : Date? 
} 

var arrHeartRate = [HeartRate]() 
let minDate = Date().addingTimeInterval(-300) //get 5min before time 
var avgHR = self.arrHeartRate.filter { (Item) -> Bool in 
       return Item.date! > minDate 
      }.reduce(0) { (res, item) -> Result<Any, <#Error: Error#>> in 
       return res 
      } 
+0

Bitte fügen Sie Ihre Array in Frage –

+0

@AshokLondhe getan –

+0

Ihr Problem gelöst ist oder Sie auf dem Laufenden Frage. Ich möchte Ihre Probe Herzfrequenz-Array, so dass ich versuchen werde, um Ihr Problem zu lösen. –

Antwort

4

Hier ist ein Code für Sie, der eine Zusammenfassung verschiedener Stackoverflow-Antworten darstellt.

class HeartRate 
{ 
    var hr = 0 
    var date: Date? 
} 

extension Collection where Iterator.Element == HeartRate, Index == Int { 
    /// Returns the average of all elements in the array 
    var average: Double { 
     return isEmpty ? 0 : Double(reduce(0) { $0 + $1.hr })/Double(endIndex-startIndex) 
    } 
} 

var arrHeartRate = [HeartRate(), HeartRate()] 
let minDate = Date().addingTimeInterval(-300) //get 5min before time 
let rateInLast5Min = arrHeartRate.filter { 
    guard let date = $0.date else { return false } 
    return date > minDate 
} 
var avgHR = rateInLast5Min.average 
+0

Awesome Mann. .. –

1

Ich habe es nicht ausführen mit einigen Anpassungen sollte aber sein, was Sie für

let rateInLast5Min = arrHeartRate.filter({ 0$.date! > minDate }) 
let hours = rateInLast5Min.map{ return $0.hr }.reduce(0, +) 
let average = Double(hours)/Double(rateInLast5Min.count) 
+0

Fehler angezeigt. Der Ausdruckstyp ist mehrdeutig ohne mehr Kontext –

+0

aktualisiert. Dies sollte funktionieren – TomCobo

3

Sie Filter tun suchen können und in zwei Schritten reduzieren. Zunächst erhalten eine Reihe von Herzfrequenz innerhalb des Zeitrahmens

let filtered = arrHeartRate.filter{$0.date ?? Date() > minDate} 

oder einige zwicken auf Null Datum aus dem gefilterten Array

let filtered = arrHeartRate.filter{$0.date ?? Date().addingTimeInterval(-500) > minDate} 

Dann Durchschnitt berechnen und das Rück ausschließen

return Double(filtered.reduce(0){$0 + $1.hr})/Double(filtered.count) 
+0

Diese Antwort wurde bereits von TomCobo gepostet Aber nur Name der Variablen geändert. das Ergebnis beider Antworten ist gleich –

+0

zeigt Problem wie. Der Ausdruckstyp ist mehrdeutig ohne weiteren Kontext. –

+0

@TejasArdeshna In welcher Zeile tritt das Problem auf? –