gpt4 book ai didi

ios - 将 swift 2.x 转换为 swift 3 问题

转载 作者:可可西里 更新时间:2023-10-31 23:58:55 27 4
gpt4 key购买 nike

我已经制作了这个函数来获取每天的所有步骤,但我想将这个函数从 swift 2.x 转换为 swift 3。但是我卡在了两个不同的点上。

let anchorDate = calendar.dateComponents(anchorComponents)  

我收到此错误:无法使用列表类型 (Datecomponents) 的参数调用 dateCompontents


关于这一点:

let stepsQuery = HKStatisticsCollectionQuery(quantityType: HKQuantityType, quantitySamplePredicate: nil, options: .CumulativeSum, anchorDate: anchorComponents!, intervalComponents: interval)

错误: 无法将 HKQuantityType.Type 类型的值转换为预期的参数类型 HKQuantityType。


完整的功能:

func getDailySteps(){
let calendar = NSCalendar.current
let interval = NSDateComponents()
interval.day = 1

var anchorComponents = calendar.dateComponents([.day , .month , .year], from: NSDate() as Date)
anchorComponents.hour = 0
let anchorDate = calendar.dateComponents(anchorComponents)

// Define 1-day intervals starting from 0:00
let stepsQuery = HKStatisticsCollectionQuery(quantityType: HKQuantityType, quantitySamplePredicate: nil, options: .CumulativeSum, anchorDate: anchorComponents!, intervalComponents: interval)

// Set the results handler
stepsQuery.initialResultsHandler = {query, results, error in
let endDate = NSDate()
let startDate = calendar.dateByAddingUnit(.Day, value: -7, toDate: endDate, options: [])
if let myResults = results{ myResults.enumerateStatisticsFromDate(startDate!, toDate: endDate) { statistics, stop in
if let quantity = statistics.sumQuantity(){
let date = statistics.startDate
let steps = quantity.doubleValueForUnit(HKUnit.countUnit())
print("\(date): steps = \(steps)")
//NOTE: If you are going to update the UI do it in the main thread
dispatch_async(dispatch_get_main_queue()){
//update UI components
}

}
} //end block
} //end if let
}

HKHealthStore?.executeQuery(stepsQuery)

}

那么如何将此方法转换为 swift 3 呢?

最佳答案

您的代码包含的错误比您描述的要多。我将您的代码复制到 playground 中试图修复它。我不能保证它会工作(我以前从未使用过 HealthKit,但它至少应该可以编译。

错误 0*

在 Swift 3 中,一些类已经重命名。例如 NSCalendarCalendar。函数中的前两行必须更改为:

let calendar = Calendar.current
var interval = DateComponents()

错误 1

要从日期组件中获取日期,您必须使用此函数:

calendar.date(from: anchorComponents)

错误2:

阅读有关 HKStatisticsCollectionQuery 的文档后和 HKQuantityType我想出了这行代码:

let stepsQuery = HKStatisticsCollectionQuery(quantityType: HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned)!, quantitySamplePredicate: nil, options: .cumulativeSum, anchorDate: anchorDate!, intervalComponents: interval)

HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned) 替换旧代码中的 HKQuantityType

anchorDate: 接收一个 Date 而不是 DateComponents

传递给 options: 的枚举大小写在 Swift 3 中以小写字母开头。

错误 3*

dateByAddingUnit 已更改。在 Swift 3 中,你使用这个:

calendar.date(byAdding: .day, value: -7, to: endDate)

(同样,枚举大小写现在以小写字母开头。)

错误 4*

enumerateStatistics 也已更改。现在是:

enumerateStatistics(from: startDate!, to: endDate)

错误5*

HKUnit.countUnit() 已重命名:

let steps = quantity.doubleValue(for: HKUnit.count())

错误 6*

使用多线程的方式已经发生了巨大的变化。

DispatchQueue.main.async {
//update UI components
}

错误 7*

HKHealthStore?.executeQuery(stepsQuery) 有点奇怪。 execute(_:)(在 Swift 3 中命名)不是静态的,只能用于 HKHealthStore 的实例。我用以下行修复了错误消息,但我不确定这是否真的有效。

HKHealthStore().execute(stepsQuery)

*我在 Playground 中使用您的代码时发现了其他错误。

关于ios - 将 swift 2.x 转换为 swift 3 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39559038/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com