用于测量的 HealthKit 单元类型 (HKUnit)
Type of HealthKit unit for measurements (HKUnit)
在使用 Apple 的 HealthKit 读取或写入健康数据时,我经常遇到不同类型的 HKSampleObject 的单位转换问题。
获取HKQuantitySample类型的healthData后,如何转换为double或其他类型?
在 Apple 的 doc for HKUnit 中,他们提到您可以通过任何 SI 或 non-SI 单位功能进行转换。
这里有一些带单位转换的 HKQuantitySample:
var data: Double? = nil
// here sample is of type HKQuantitySample
switch type {
case HKSampleType.quantityType(forIdentifier: .environmentalAudioExposure),
HKSampleType.quantityType(forIdentifier: .headphoneAudioExposure):
data = sample.quantity.doubleValue(for: HKUnit.decibelAWeightedSoundPressureLevel())
case HKSampleType.quantityType(forIdentifier: .heartRate):
data = sample.quantity.doubleValue(for: HKUnit(from: "count/min"))
case HKObjectType.quantityType(forIdentifier: .oxygenSaturation):
data = sample.quantity.doubleValue(for: HKUnit(from: "%")) * 100
case HKObjectType.quantityType(forIdentifier: .bodyMass),
HKObjectType.quantityType(forIdentifier: .leanBodyMass):
data = sample.quantity.doubleValue(for: HKUnit.gramUnit(with: .kilo))
case HKObjectType.quantityType(forIdentifier: .stepCount),
HKObjectType.quantityType(forIdentifier: .flightsClimbed),
HKObjectType.quantityType(forIdentifier: .bodyMassIndex),
HKObjectType.quantityType(forIdentifier: .uvExposure):
data = sample.quantity.doubleValue(for: HKUnit.count())
case HKObjectType.quantityType(forIdentifier: .heartRateVariabilitySDNN):
data = sample.quantity.doubleValue(for: HKUnit.secondUnit(with: .milli))
case HKObjectType.quantityType(forIdentifier: .appleStandTime):
data = sample.quantity.doubleValue(for: HKUnit.second())
case HKObjectType.quantityType(forIdentifier: .walkingHeartRateAverage),
HKObjectType.quantityType(forIdentifier: .restingHeartRate):
data = sample.quantity.doubleValue(for: HKUnit(from: "count/s"))
case HKObjectType.quantityType(forIdentifier: .distanceWalkingRunning),
HKObjectType.quantityType(forIdentifier: .distanceCycling):
data = sample.quantity.doubleValue(for: HKUnit.meter())
case HKObjectType.quantityType(forIdentifier: .basalBodyTemperature),
HKObjectType.quantityType(forIdentifier: .bodyTemperature):
data = sample.quantity.doubleValue(for: HKUnit.degreeCelsius())
case HKObjectType.quantityType(forIdentifier: .bloodPressureSystolic),
HKObjectType.quantityType(forIdentifier: .bloodPressureDiastolic):
data = sample.quantity.doubleValue(for: HKUnit.millimeterOfMercury())
case HKObjectType.quantityType(forIdentifier: .peakExpiratoryFlowRate):
data = sample.quantity.doubleValue(for: HKUnit(from: "L/min"))
case HKObjectType.quantityType(forIdentifier: .vo2Max):
data = sample.quantity.doubleValue(for: HKUnit(from: "ml/kg*min"))
default:
break
}
注意(感谢 ):您可以使用 HealthKit 提供的一些常见 class 方法构建各种类型的 HKUnits。
例如您可以使用:
let unit = HKUnit(from: "ml/kg*min"
或:
let kiloMin = HKUnit.gramUnit(with: .kilo).unitMultiplied(by: .minute())
let milliLit = HKUnit.literUnit(with: .milli)
let unit = milliLit.unitDivided(by: kiloMin)
在使用 Apple 的 HealthKit 读取或写入健康数据时,我经常遇到不同类型的 HKSampleObject 的单位转换问题。
获取HKQuantitySample类型的healthData后,如何转换为double或其他类型?
在 Apple 的 doc for HKUnit 中,他们提到您可以通过任何 SI 或 non-SI 单位功能进行转换。
这里有一些带单位转换的 HKQuantitySample:
var data: Double? = nil
// here sample is of type HKQuantitySample
switch type {
case HKSampleType.quantityType(forIdentifier: .environmentalAudioExposure),
HKSampleType.quantityType(forIdentifier: .headphoneAudioExposure):
data = sample.quantity.doubleValue(for: HKUnit.decibelAWeightedSoundPressureLevel())
case HKSampleType.quantityType(forIdentifier: .heartRate):
data = sample.quantity.doubleValue(for: HKUnit(from: "count/min"))
case HKObjectType.quantityType(forIdentifier: .oxygenSaturation):
data = sample.quantity.doubleValue(for: HKUnit(from: "%")) * 100
case HKObjectType.quantityType(forIdentifier: .bodyMass),
HKObjectType.quantityType(forIdentifier: .leanBodyMass):
data = sample.quantity.doubleValue(for: HKUnit.gramUnit(with: .kilo))
case HKObjectType.quantityType(forIdentifier: .stepCount),
HKObjectType.quantityType(forIdentifier: .flightsClimbed),
HKObjectType.quantityType(forIdentifier: .bodyMassIndex),
HKObjectType.quantityType(forIdentifier: .uvExposure):
data = sample.quantity.doubleValue(for: HKUnit.count())
case HKObjectType.quantityType(forIdentifier: .heartRateVariabilitySDNN):
data = sample.quantity.doubleValue(for: HKUnit.secondUnit(with: .milli))
case HKObjectType.quantityType(forIdentifier: .appleStandTime):
data = sample.quantity.doubleValue(for: HKUnit.second())
case HKObjectType.quantityType(forIdentifier: .walkingHeartRateAverage),
HKObjectType.quantityType(forIdentifier: .restingHeartRate):
data = sample.quantity.doubleValue(for: HKUnit(from: "count/s"))
case HKObjectType.quantityType(forIdentifier: .distanceWalkingRunning),
HKObjectType.quantityType(forIdentifier: .distanceCycling):
data = sample.quantity.doubleValue(for: HKUnit.meter())
case HKObjectType.quantityType(forIdentifier: .basalBodyTemperature),
HKObjectType.quantityType(forIdentifier: .bodyTemperature):
data = sample.quantity.doubleValue(for: HKUnit.degreeCelsius())
case HKObjectType.quantityType(forIdentifier: .bloodPressureSystolic),
HKObjectType.quantityType(forIdentifier: .bloodPressureDiastolic):
data = sample.quantity.doubleValue(for: HKUnit.millimeterOfMercury())
case HKObjectType.quantityType(forIdentifier: .peakExpiratoryFlowRate):
data = sample.quantity.doubleValue(for: HKUnit(from: "L/min"))
case HKObjectType.quantityType(forIdentifier: .vo2Max):
data = sample.quantity.doubleValue(for: HKUnit(from: "ml/kg*min"))
default:
break
}
注意(感谢
例如您可以使用:
let unit = HKUnit(from: "ml/kg*min"
或:
let kiloMin = HKUnit.gramUnit(with: .kilo).unitMultiplied(by: .minute())
let milliLit = HKUnit.literUnit(with: .milli)
let unit = milliLit.unitDivided(by: kiloMin)