2016-11-28 6 views
1

プレイグランドで次のコードを実行すると、書式設定された文字列がnilとして返されます。派生したカスタムMeasurementクラスで何が欠けていますか?派生単位付き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

あなたは、あなたのコード内のいくつかのことを更新する必要があります。

最初にFormatterstringメソッドを使用していますが、これはAny?で、オプションのStringを返します。第二に、あなたは.naturalScaleunitOptionsプロパティが設定されているMeasurementFormatter(デフォルト)を使用している

var measureStringCustom = formatter.string(from: measureCustom) 

:あなたはfromにパラメータ名を変更する場合は、非オプションを返しMeasurementFormatter上で定義されたメソッドを使用します。 。これを.providedUnitに変更すると、出力が得られることがわかります。問題は、.naturalScaleが指定されたロケールに適切な単位を使用し、現在のところカスタムDimensionサブクラス用に設定する方法がないことです。

だから、何あなたは何を達成する方法は.providedUnitフォーマッタと一緒にconverted方法を使用することで、そのよう:

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

最後に、あなたはおそらくまだあなたが期待する出力を取得されていません。これは、UnitConverterLinearcoefficientbaseUnitで返され、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)) 
} 
関連する問題