将 HKWorkout 向下转换为我的自定义 class

Down casting HKWorkout to my custom class

使用 Swift 4.0,我试图在内置 HealhKit class HKWorkout 与我自己的自定义 class 之间进行向下转换。我的 class 继承自 HKWorkout。 HKWorkout 继承自 HKSample。从 HKSample 作品向下转换到 HKWorkout。那么为什么我不能进一步将其转换为我自己的 class?如果可能的话,我想在不显式循环样本数组的情况下执行转换。我自定义的原因class是为了存储addl属性和方法。

//This works. Note I am not explicitly looping over samples array.
//samples is an array of HKSample objects.
let workouts:[HKWorkout] = samples as! [HKWorkout]

//Does not work. FRWorkout is my class, inherits from HKWorkout.
let workouts:[FRWorkout] = samples as! [FRWorkout]

最终目标是获取一组 FRWorkout 对象而不是 HHWorkout 对象。

以下是完整的上下文:

class FRWorkout: HKWorkout {
    var customProperty:UInt = 0

}

let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate,
                                              ascending: false)

        let query = HKSampleQuery(sampleType: HKObjectType.workoutType(),
                                  predicate: nil,
                                  limit: 50,
                                  sortDescriptors: [sortDescriptor]) { (query, samples, error) in

                                    //Here I want FRWorkout objects instead of HKWorkout. I need to add addl info to the HKWorkout. How can this be achieved?
                                    guard let workouts = samples as? [HKWorkout], error == nil else {
                                            completion(nil, error)
                                            return
                                    }

}

根据文档,不建议子类化,因此在进一步研究之前探索替代方案可能是个好主意。 From the docs:

Like many HealthKit classes, the HKWorkout class should not be subclassed. You may extend workouts by adding metadata with custom keys as appropriate for your app. For more information, see the methods init(activityType:start:end:duration:totalEnergyBurned:totalDistance:metadata:) and init(activityType:start:end:workoutEvents:totalEnergyBurned:totalDistance:metadata:).

HKSampleQuery 将 return 个 HKWorkout 实例,因为您将 HKObjectType.workoutType() 指定为 sampleType

您无法获取 FRWorkoutHKSampleQuery 到 return 个实例,因为 HealthKit 框架对您的子 class.

一无所知

即使您已声明您的 class、FRWorkoutHKWorkout 的子 class,您也没有收到来自 FRWorkout 的实例HKSampleQuery 所以你不能向下转换 returned 对象。

正如@KaneChehire 所指出的,在任何情况下,subclassing HRWorkout 都不是正确的方法。