Нумерованные имена переменных, такие как oldHR1
, oldHR2
и т. Д., Являются очень хорошим признаком того, что вы должны использовать массив.В этом случае я бы порекомендовал вам извлекать это вычисление среднего значения в его собственные типы данных, что облегчает и облегчает обработку этих данных.
struct RunningAverage {
let maxSize: Int
var samples: [Double]
init(maxSize: Int, initialSamples samples: [Double] = []) {
self.maxSize = maxSize
self.samples = samples
}
mutating func addSample(_ newValue: Double) {
samples.append(newValue)
if maxSize < samples.count { samples.removeFirst() }
}
/// Will return `nil` when there are no samples.
/// This allows for easy nil coalescence, without introducing the full burden of
/// needing to unwrap in the case when the samples are known to be non-empty.
var average: Double! {
if self.samples.isEmpty { return nil }
return samples.reduce(0, +) / Double(samples.count)
}
}
var runningAverage = RunningAverage(maxSize: 5)
let mockSamples = 1...10
let runningAverages = mockSamples.map { mockSample -> Double in
runningAverage.addSample(Double(mockSample))
return runningAverage.average
}
print(runningAverages) // => [1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]