В iOS 10 Apple представила несколько компонентов для количественных измерений. Например:
let velocity = Measurement(value: 3, unit: UnitSpeed.metersPerSecond)
Несмотря на подробность, преимущества заключаются в том, что вы можете преобразовать в любую другую единицу без подверженных ошибкам встроенных вычислений:
// before
let velocityMetersPerSecond = 3.0
let velocityKilometersPerHour = velocityMetersPerSecond * 1000 / 60
// after
let velocityKilometersPerHour = velocity.converted(to: .kilometersPerHour)
В то время как Apple поддерживает многие устройства прямо из коробки, мне нужно устройство, которое они не поддерживают. Однако Apple помнила о расширяемости, и один из способов ввести новую метрику — расширить класс Unit:
extension UnitSpeed {
static let furlongPerFornight =
UnitSpeed(symbol: "fur/ftn", converter: UnitConverterLinear(coefficient:
201.168 / 1209600.0)
}
Мне нужна скорость от источника в meters/second до единиц min/km. Следующая математика ниже показывает, как работает преобразование:
min / km = 1 / (m / s) * 1000 / 60
Проблема, с которой я столкнулся, заключается в том, как выразить мультипликативную обратную (или обратную) величину исходного значения в преобразовании. Вот ошибочная версия:
extension UnitSpeed {
// still missing 1 / source value!
static let minutesPerKilometer = UnitSpeed(symbol: "min/km",
UnitConverterLinear(coefficient: 1000.0 / 60.0)
}