【问题标题】:Swift fetch minutes per kilometer from seconds per meter从每米秒数快速获取每公里分钟数
【发布时间】:2023-11-21 22:56:02
【问题描述】:

我有一个 CLLocations 数组,每个数组都有每米元素的秒数。我想计算该数组的运行拆分(每公里分钟数)。如何从CLLocations 数组中获取每公里的分钟数?

这就是我获得以下位置的方式。

let query = HKWorkoutRouteQuery(route: route) { (_, locations, _, error) in
        if let error = error {
            print("There was an error fetching route data: ", error)
            return
        }

        guard let locations = locations else { return }
    }
    healthStore.execute(query)

【问题讨论】:

    标签: swift cllocationmanager cllocation


    【解决方案1】:

    CLLocationSpeed 定义为以米/秒为单位的速度,参见Apple Docs

    它是Double 的别名,所以你可以直接翻译成:

    let speedMS = location.speed
    let speedKMM = speedMS * 3 / 50
    

    您可以使用扩展来提高代码的可读性:

    extension CLLocationSpeed {
        func toKmM() -> Double {
            return self * 3 / 50
        }
    }
    

    当你想获得公里/米时,你只需使用CLLocation.speed.toKmM()

    编辑:
    @Leo Dabus 甚至更简单的解决方案,扩展 CLLocation:

    extension CLLocation { 
        var kilometersPerMinute: Double { 
            speed * 0.06 
        } 
    }
    

    【讨论】:

    • 每经过一公里我将如何调用它?
    • 我添加了一个你可以使用的扩展,每次你想获得速度km/h你应该打电话给toKmH()
    • 我正在尝试获取 KM/M(每分钟公里数)
    • @GaryHost speed * 0.06
    • @GaryHost,对不起,我读了 km/h,km/m 应该是 3/50 而不是 18/5。我会编辑答案
    【解决方案2】:

    您还可以创建自己的速度单位来扩展 UnitSpeed。这样做的好处是您可以关联一个符号并获得对转换的更多控制:

    extension UnitSpeed {
        static var metersPerMinute: UnitSpeed = .init(symbol: "m/min", converter:  UnitConverterLinear(coefficient: 1 / 60))
        static var kilometersPerMinute: UnitSpeed = .init(symbol: "km/min", converter:  UnitConverterLinear(coefficient: 50 / 3))
    }
    

    let metersPerSecond = Measurement<UnitSpeed>(value: 30, unit: .metersPerSecond)
    let kilometersPerHour = metersPerSecond.converted(to: .kilometersPerHour)      // 107.9999136000691 km/h
    let kilometersPerMinute = metersPerSecond.converted(to: .kilometersPerMinute)  // 1.7999999999999998 km/min
    let formatter = MeasurementFormatter()
    formatter.unitStyle = .medium
    formatter.unitOptions = .providedUnit
    formatter.numberFormatter.maximumFractionDigits = 1
    formatter.string(from: kilometersPerHour)      // "108 km/h"
    formatter.string(from: kilometersPerMinute)    // "1.8 km/min"
    
    UnitSpeed.kilometersPerMinute.converter.value(fromBaseUnitValue: 1) // 0.06
    

    【讨论】:

    • 我希望可以简单地写UnitLength.meters / UnitDuration.minutes,因为我建议使用单位的全部原因是避免对单位关系进行硬编码。 Ole Begemann 在这里做了类似的工作:oleb.net/blog/2016/07/measurements-and-units 但我认为对于这样一个简单的问题推荐它太复杂了 :)