使用Swift 4.0,我试图在内置的HealhKit类HKWorkout和我自己的自定义类之间进行向下转换。我的课是从香港训练中学来的。HKWorkout继承自HKSample从香港样板作品到香港健身。那么,为什么我不能把这个放到我自己的课上呢?如果可能的话,我希望在不显式循环采样数组的情况下执行转换。我自定义类的原因是存储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
                                    }

}

最佳答案

HKSampleQuery将返回HKWorkout的实例,因为您将HKObjectType.workoutType()指定为sampleType
您不能让HKSampleQuery返回FRWorkout的实例,因为HealthKit框架对您的子类一无所知。
即使您已经将您的类FRWorkout声明为HKWorkout的子类,但您没有从FRWorkout接收HKSampleQuery的实例,因此您不能向下转换返回的对象。
正如@KaneChehire所指出的,在任何情况下,对HRWorkout进行子类化都不是正确的方法。

关于ios - 将HKWorkout转换为我的自定义类(class),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48196320/

10-11 00:36