Context:
我正在编写一个应用程序,我想在其中显示每个菜单项的营养成分。
我希望能够灵活地使用Measurement 类进行转换。
Problem:
问题是卡路里是在Measurement 中测量的,而蛋白质等其他属性是在Measurement中测量的。我决定将变量设为Measurement 类型,这样它就可以处理这两种类型。但随后我就失去了对变量进行转换或操作的所有可能性。
这个函数会给我错误(这是有道理的,我只是不知道解决这个问题的最佳方法是什么)
二元运算符“/”不能应用于两个“测量”
操作数
func getPercentage() -> Double {
return value / property.referenceIntake
}
如果我尝试投射它,我会收到此错误
从“测量”转换为不相关的类型
“测量”总是失败
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)
}
}
}