背景:
我正在编写一款应用程序,希望显示每个菜单项的营养成分。我想要使用Measurement类转换单位制。
问题:
问题在于,卡路里是用Measurement < UnitEnergy >来衡量的,而其他属性如蛋白质是用Measurement < UnitMass >来衡量的。于是我决定将变量类型设置为Measurement < Unit >,以便处理这两种类型。但是,我失去了所有与该变量进行转换或操作的可能性。
这个函数会报错(这很有道理,只是我不知道最好的解决方法)
二元运算符'/'不能应用于两个'Measurement < Unit >'操作数。
func getPercentage() -> Double {
return value / property.referenceIntake
}
如果我尝试对其进行转换,会出现以下错误:
从“Measurement < Unit >”向无关类型“Measurement <UnitMass>”的转换始终失败
if let massUnitMeasurement = value as? Measurement<UnitMass>, let referenceMeasurement = property.referenceIntake as? {
....
}
我到目前为止的进展:
struct NutritionInformation {
let property: NutritionProperties
let value: Measurement<Unit>
var formattedValue: String {
let formatter = MeasurementFormatter()
formatter.unitStyle = .medium
formatter.unitOptions = .providedUnit
return formatter.string(from: value)
}
}
enum NutritionProperties {
case calories
case carbohydrate
case cholesterol
case fat
case saturatedFat
case fibre
case protein
case sodium
case sugar
var unit: Unit {
switch self {
case .calories: return UnitEnergy.kilocalories
case .cholesterol, .sodium: return UnitMass.milligrams
default: return UnitMass.grams
}
}
var referenceIntake: Measurement<Unit> {
switch self {
case .calories: return Measurement(value: 2000, unit: unit)
case .fat: return Measurement(value: 70, unit: unit)
case .saturatedFat: return Measurement(value: 20, unit: unit)
case .carbohydrate: return Measurement(value: 260, unit: unit)
case .fibre: return Measurement(value: 30, unit: unit)
case .sugar: return Measurement(value: 90, unit: unit)
case .protein: return Measurement(value: 50, unit: unit)
case .sodium: return Measurement(value: 2300, unit: unit)
case .cholesterol: return Measurement(value: 300, unit: unit)
}
}
}
.value
? - Sulthan