Давайте начнем с этого массива:
let dataPoints = [0.0001, 0.1, 1, 2, 3, 1000, 2000]
Наиболее распространенной единицей, подходящей для этого массива, будет единица для медианного значения:
let median = dataPoints.sorted(by: <)[dataPoints.count / 2]
let medianMeasurement = Measurement(value: 1700, unit: UnitLength.meters)
В следующем фрагменте мы выясним наиболее подходящую единицу. Если единица измерения меньше точки данных, то она считается естественной единицей:
let imperialUnitsNames: [UnitLength] = [.inches,
.feet,
.yards,
.fathoms,
.furlongs,
.miles,
]
let imperialUnitsInMeters: [Any] = imperialUnitsNames.map { unit in
let m = Measurement(value: 1, unit: unit).converted(to: .meters)
return m.value
}
let zipped = zip(imperialUnitsInMeters, imperialUnitsNames)
let naturalUnit = zipped.reversed()
.first(where: { $0.0 < median})!
.1
Вы можете настроить возможные единицы в imperialUnitsNames
.
Давайте создадим форматер измерений:
let measurementFormatter = MeasurementFormatter()
measurementFormatter.unitOptions = .providedUnit
Теперь мы готовы отформатировать dataPoints
:
let measurementStrings: [String] = dataPoints.map { dataPoint in
let measurement = Measurement(value: dataPoint, unit: UnitLength.meters)
let newMeasurement = measurement.converted(to: naturalUnit)
return measurementFormatter.string(from: newMeasurement)
}
print(measurementStrings) //["0 ftm", "0.055 ftm", "0.547 ftm", "1.094 ftm", "1.64 ftm", "546.807 ftm", "1,093.613 ftm"]