Swift调用带完成处理程序的getDistance函数获取Double值出错求助
问题解决:HealthKit获取Workout距离的函数调用错误
错误原因分析
你遇到的两个错误本质是对异步函数的调用方式理解有误:
getDistance是基于completion闭包的异步函数,没有使用Swift的async/await语法,所以不能用await直接赋值。- 调用时你传入的是闭包的类型
(Double) -> Void,而不是实际执行逻辑的闭包实例。
正确调用方式
直接传入一个闭包来接收返回的距离值,比如你要打印到控制台,代码如下:
healthKitManager.getDistance(healthStore: healthStore, training: activities[0]) { distance in print("获取到的训练距离:\(distance)") // 后续可以在这里用distance构建Activities数组 }
原函数的优化建议
另外你的原函数还有几个可以改进的地方,避免潜在问题:
- 不要强制解包
type!,应该处理类型获取失败的情况 - 距离单位用错了:
HKUnit.count()是计数单位,应该用长度单位(比如米/公里) - 变量尽量用
let代替var(不需要修改的变量)
优化后的函数代码:
func getDistance(healthStore: HKHealthStore, training: HKWorkout, completion: @escaping (Double)-> Void){ // 先校验距离类型是否能获取到 guard let distanceType = HKSampleType.quantityType(forIdentifier: .distanceWalkingRunning) else { print("无法获取距离类型") completion(0.0) return } let timePredicate = HKQuery.predicateForSamples(withStart: training.startDate, end: training.endDate) let query = HKStatisticsQuery(quantityType: distanceType, quantitySamplePredicate: timePredicate, options: .cumulativeSum) { _, result, error in // 先处理错误 if let error = error { print("查询距离失败:\(error.localizedDescription)") completion(0.0) return } guard let result = result, let totalDistance = result.sumQuantity() else { completion(0.0) return } // 用米作为单位,需要公里的话换成HKUnit.kilometer() completion(totalDistance.doubleValue(for: HKUnit.meter())) } healthStore.execute(query) }
内容的提问来源于stack exchange,提问作者Tobias Frydl
相关产品推荐
相关产品推荐

