You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift调用带完成处理程序的getDistance函数获取Double值出错求助

问题解决:HealthKit获取Workout距离的函数调用错误

错误原因分析

你遇到的两个错误本质是对异步函数的调用方式理解有误:

  1. getDistance是基于completion闭包的异步函数,没有使用Swift的async/await语法,所以不能用await直接赋值。
  2. 调用时你传入的是闭包的类型(Double) -> Void,而不是实际执行逻辑的闭包实例。

正确调用方式

直接传入一个闭包来接收返回的距离值,比如你要打印到控制台,代码如下:

healthKitManager.getDistance(healthStore: healthStore, training: activities[0]) { distance in
    print("获取到的训练距离:\(distance)")
    // 后续可以在这里用distance构建Activities数组
}

原函数的优化建议

另外你的原函数还有几个可以改进的地方,避免潜在问题:

  1. 不要强制解包type!,应该处理类型获取失败的情况
  2. 距离单位用错了:HKUnit.count()是计数单位,应该用长度单位(比如米/公里)
  3. 变量尽量用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:06:56