如何为 mmol/L(每升毫摩尔)构造 HealthKit HKUnit 以获得血糖值?

How do I construct a HealthKit HKUnit for mmol/L (millimoles per liter) for Blood Glucose values?

在 iOS 8.2 中将血糖值重新添加到“健康”中:https://support.apple.com/en-us/HT203113

如何为 mmol/L(每升毫摩尔)构造 HealthKit HKUnit 以获得血糖值?

以下都抛出异常:由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'无法解析分解字符串...

HKUnit *mmolPerL = [HKUnit unitFromString:@"mmol<molar mass>/L"];
HKUnit *mmolPerL = [HKUnit unitFromString:@"mmol/L"];

可以确认所提供的示例不起作用(每个排列),替代 mg/dL 单元起作用。

总而言之,这两种提议的方法都有效,关于生成的 HKUnit 的结构,结果相似(@cbartel 提出的方法,常数实际上是四舍五入的,而不是另一个):

Printing description of mmolPerL->_baseUnits->_factors:
NSMapTable {
[6] mmol<180.15588> -> 1
[7] L -> -1
}

我会使用提供的常数使用较短的形式:

HKUnit *mmolPerL = [HKUnit unitFromString:[NSString stringWithFormat:@"mmol<%f>/L",HKUnitMolarMassBloodGlucose]];

构建两个 HKUnit,然后执行单元数学以创建复数单元:

HKUnit *mmolPerL = [[HKUnit moleUnitWithMetricPrefix:HKMetricPrefixMilli molarMass:HKUnitMolarMassBloodGlucose] unitDividedByUnit:[HKUnit literUnit]];

传递给 HKUnit 的 unitFromString: 的“摩尔质量”必须是代表给定物质 molar mass 的十进制值。

血糖的摩尔质量约为 180.156(更精确的值请参见 HKUnit.h 中的 HKUnitMolarMassBloodGlucose)。要使用您想要使用的单位字符串来构建它:

HKUnit *mmolPerL = [HKUnit unitFromString:@"mmol<180.156>/L"];

这是 Swift 4 中的示例:

let mass = HKUnitMolarMassBloodGlucose
let mmolPerLiter = HKUnit.moleUnit(with: .milli, molarMass: mass).unitDivided(by: .liter())

在Swift 4:

let bloodGlucoseMgDlUnit = HKUnit.gramUnit(with: .milli).unitDivided(by: HKUnit.literUnit(with: .deci))
let bloodGlucoseMMolLUnit = HKUnit.moleUnit(with: .milli, molarMass: HKUnitMolarMassBloodGlucose).unitDivided(by: HKUnit.liter())

let mgdlValue = sample.quantity.doubleValue(for: bloodGlucoseMgDlUnit)
let mmollValue = sample.quantity.doubleValue(for: bloodGlucoseMMolLUnit)

示例:

81.0 mg/dL, 4.4961063718806 mmol/L
83.0 mg/dL, 4.6071213440258 mmol/L