Я пытаюсь выучить Swift и понять аптечку, но я дошел до того, что застрял.
Я могу получить как базовую энергию, так и активную энергию из аптечки, но я не знаю, как объединить их для полной сожженной энергии. Я знаю, что вы можете получить это из объекта тренировки, но вы не можете получить к нему доступ, не так ли?
Я использую эту функцию для получения значений за последние 30 дней в виде словарей:
// MARK: - GET CALORIES FOR TIMESPAN (30 days)
func getEnergyTimespan(forDay days: Int, _ identifier: HKQuantityTypeIdentifier, completion: @escaping ((_ weight: Double?, _ date: Date?) -> Void)) {
guard let identifierType = HKObjectType.quantityType(forIdentifier: identifier) else {
print("*** Unable to create the matching type ***")
return
}
let now = Date()
let startDate = Calendar.current.date(byAdding: DateComponents(day: -days), to: now)!
var interval = DateComponents()
interval.day = 1
var anchorComponents = Calendar.current.dateComponents([.day, .month, .year], from: now)
anchorComponents.hour = 0
let anchorDate = Calendar.current.date(from: anchorComponents)!
let query = HKStatisticsCollectionQuery(quantityType: identifierType,
quantitySamplePredicate: nil,
options: [.mostRecent],
anchorDate: anchorDate,
intervalComponents: interval)
query.initialResultsHandler = { _, results, error in
guard let results = results else {
print("ERROR")
return
}
results.enumerateStatistics(from: startDate, to: now) { statistics, _ in
if let sum = statistics.mostRecentQuantity() {
let identifierValue = sum.doubleValue(for: HKUnit.kilocalorie())
completion(identifierValue, statistics.startDate)
return
}
}
}
healthKitDataStore!.execute(query)
}
и назовите его следующим образом:
getEnergyTimespan(forDay: 30, .activeEnergyBurned) {totalCals, date in
guard let totalCals = totalCals else { return }
let dateValue = DateFormatter.localizedString(from: date!, dateStyle: .short, timeStyle: .none)
self.activeEnergyBurnedTimespan[dateValue] = totalCals
self.activeEnergyCount.append(TimespanObject(date: dateValue, value: totalCals))
}
getEnergyTimespan(forDay: 30, .basalEnergyBurned) {totalCals, date in
guard let totalCals = totalCals else { return }
let dateValue = DateFormatter.localizedString(from: date!, dateStyle: .short, timeStyle: .none)
self.basalEnergyBurnedTimespan[dateValue] = totalCals
self.basalEnergyCount.append(TimespanObject(date: dateValue, value: totalCals))
}
В результате у меня останутся два словаря с ключом: значения типа "11/08/2019": 1345.0 (дата, калории)
Как лучше всего объединить эти два словаря? Они используют одни и те же ключи (дату), но я хочу объединить значения.
Или есть ли лучший способ запросить общее потребление энергии за день / промежуток времени?
Благодарен за ответыи предложения.