2016-11-28 13 views
1

Когда я запускаю следующий код на игровой площадке, отформатированная строка возвращается как нуль. Что мне не хватает в производном пользовательском классе измерений?Использование MeasurementFormatter с производным модулем

open class UnitFlowRate : Dimension { 
    open override static func baseUnit() -> UnitFlowRate { return self.metricTonsPerHour } 

    static let shortTonsPerHour = UnitFlowRate(symbol: NSLocalizedString("stph", comment: "short tons per hour"), converter: UnitConverterLinear(coefficient: 1)) 
    static let metricTonsPerHour = UnitFlowRate(symbol: NSLocalizedString("mtph", comment: "metric tons per hour"), converter: UnitConverterLinear(coefficient: 2)) 
} 

var measureCustom = Measurement<UnitFlowRate>(value: 12.31, unit: .shortTonsPerHour) 
var measureSystem = Measurement<UnitLength>(value: 12.31, unit: .inches) 

var formatter = MeasurementFormatter() 
var measureStringCustom = formatter.string(for: measureCustom) 
var measureStringSystem = formatter.string(for: measureSystem) 
print(measureCustom) // This works 
print(measureSystem) // This works 
print(measureStringCustom) // This is nil - Why? 
print(measureStringSystem) // This works 

Выход:

12.31 stph 
12.31 in 
nil 
Optional("0 mi") 

ответ

1

Вам нужно обновить несколько вещей в вашем коде.

Во-первых, вы используете метод string на Formatter который принимает Any? и возвращает дополнительный String. Если изменить имя параметра для from, вы будете использовать метод, описанный на MeasurementFormatter, который возвращает не-необязательными:

var measureStringCustom = formatter.string(from: measureCustom) 

Во-вторых, вы используете MeasurementFormatter, который имеет unitOptions набор свойств для .naturalScale (по умолчанию) , Если вы измените это на .providedUnit, вы увидите, что теперь вы получаете некоторый результат. Проблема в том, что .naturalScale будет использовать соответствующий блок для данного языка, и в настоящее время нет способа установить то, что предназначено для пользовательских подклассов Dimension.

Итак, способ добиться того, что вы, что использовать метод converted вместе с .providedUnit форматировщиком, например, так:

let converted = measureCustom.converted(to: .metricTonsPerHour) 
var formatter = MeasurementFormatter() 
formatter.unitOptions = .providedUnit 
print(formatter.string(from: converted)) 

Наконец, вы, вероятно, до сих пор не получает вывод, который вы ожидаете. Это связано с тем, что coefficient для UnitConverterLinear, который возвращается baseUnit, должен быть 1. Я ожидаю, что вы намереваетесь определить свой размер следующим образом (обратите внимание на уменьшенные коэффициенты):

open class UnitFlowRate : Dimension { 
    open override static func baseUnit() -> UnitFlowRate { return self.metricTonsPerHour } 
    static let shortTonsPerHour = UnitFlowRate(symbol: NSLocalizedString("stph", comment: "short tons per hour"), converter: UnitConverterLinear(coefficient: 0.5)) 
    static let metricTonsPerHour = UnitFlowRate(symbol: NSLocalizedString("mtph", comment: "metric tons per hour"), converter: UnitConverterLinear(coefficient: 1)) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^