Как вернуть отформатированное значение и единицу измерения
Я пытаюсь получить отформатированное значение из измерения и единиц в виде двух отдельных строк. Я написал функцию ниже, чтобы сделать это. Я борюсь с форматом функции для расширения для обработки шаблона.
Это не работает:
func getFormattedValueAndUnitFromMeasurement( measurement: Measurement<Unit> )
Следующее работает, но тогда мне нужно определить функцию для каждого типа модуля.
func getFormattedValueAndUnitFromMeasurement( measurement: Measurement<UnitLength> )
Вот код, который я использую.
var diameter: Measurement<UnitLength> = Measurement<UnitLength>( value: 13, unit: .inches)
let diameterFormatter = MeasurementFormatter()
diameterFormatter.unitStyle = .medium
diameterFormatter.unitOptions = .providedUnit // .natural
diameterFormatter.numberFormatter.generatesDecimalNumbers = true
diameterFormatter.numberFormatter.maximumFractionDigits = 1
// Get the formatted text for the value and the units
let diameterText = diameterFormatter.getFormattedValueAndUnitFromMeasurement( measurement: diameter )
extension MeasurementFormatter {
func getFormattedValueAndUnitFromMeasurement( measurement: Measurement<Unit> ) -> ( valueString: String, unitString: String)
{
// Number Formatter
let numberFormatter = self.numberFormatter
// This assumes the number is going to be displayed in the provided units. Ok for now
let numberString = numberFormatter?.string( from: NSNumber (value: measurement.value) )
// Figure out just the units of the string
var units: String = self.string( for: measurement)!
if ( units.hasPrefix(numberString!) ) {
units.removeSubrange((numberString?.startIndex)! ..< (numberString?.index((numberString?.startIndex)!, offsetBy: (numberString?.characters.count)! ))!)
}
return ( numberString!, units)
}
}
1 ответ
Measurement<Unit>
а также Measurement<UnitLength>
считаются двумя различными типами, такими как String
а также Int
, Вы должны использовать дженерики для работы с желаемыми типами, например
func getFormattedValueAndUnitFromMeasurement<T>( measurement: Measurement<T> )
-> ( valueString: String, unitString: String)