2016-11-28 2 views
1

Lorsque j'exécute le code suivant dans un Playground, la chaîne mise en forme revient à zéro. Que manque-t-il dans la classe de mesure personnalisée dérivée?Utilisation de MeasurementFormatter avec l'unité dérivée

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 

Sortie:

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

Répondre

1

Vous devez mettre à jour votre code quelques choses.

Tout d'abord, vous utilisez la méthode string sur Formatter qui prend Any? et retourne une String en option. Si vous modifiez le nom du paramètre à from, vous utiliserez la méthode définie sur MeasurementFormatter qui renvoie une non-option:

var measureStringCustom = formatter.string(from: measureCustom) 

En second lieu, vous utilisez un MeasurementFormatter qui a la unitOptions propriété est définie sur .naturalScale (valeur par défaut) . Si vous changez cela en, .providedUnit, vous verrez que vous obtenez maintenant une sortie. Le problème est que .naturalScale utilisera l'unité appropriée pour la locale donnée et il n'y a actuellement aucun moyen de définir ce que c'est pour les sous-classes personnalisées Dimension.

Ainsi, la façon d'obtenir ce que vous ce qui est d'utiliser la méthode converted avec un formatter .providedUnit, comme ceci:

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

Enfin, vous êtes probablement toujours pas obtenir la sortie que vous attendez. C'est parce que le coefficient pour le UnitConverterLinear qui est retourné par baseUnit devrait être 1. Je m'attends à ce que vous vouliez définir votre dimension comme suit (notez les coefficients réduits):

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)) 
}