Как вернуть отформатированное значение и единицу измерения

Я пытаюсь получить отформатированное значение из измерения и единиц в виде двух отдельных строк. Я написал функцию ниже, чтобы сделать это. Я борюсь с форматом функции для расширения для обработки шаблона.

Это не работает:

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)
Другие вопросы по тегам