При делении каждого значения на последнее значение в последнем операторе map вы игнорируете тот факт, что все уже вычтено первым значением.
Чтобы исправить это, вы должны разделить на диапазонзначений (разница между максимальным и минимальным значениями).
Если ваш массив отсортирован, это будет:
guard let maxValue = dates.last, let minValue = dates.first else {
return
}
let percentages = dates
.map {$0 - minValue}
.map {$0 / (maxValue - minValue)}
Это нормализует все значения так, что первое значениеравно 0, а последнее значение равно 1, а все остальное находится между.
Если вы не хотите нормализовать первое значение до 0 (но оставляете все в диапазоне от 0 до 1), вы можете пропустить шаг вычитания:
let percentages = dates.map {$0 / maxValue}
Если ваш массив не отсортирован, вы можете использовать функции .min()
и .max()
вашего массива:
guard let maxValue = dates.max(), let minValue = dates.min() else {
return
}