将HKWorkout下载到我的自定义类

时间:2018-01-10 21:25:48

标签: ios swift casting health-kit

使用Swift 4.0,我试图在内置的HealhKit类HKWorkout和我自己的自定义类之间进行向下转换。我的班级继承自HKWorkout。 HKWorkout继承自HKSample。从HKSample工作向下铸造到HKWorkout。那么为什么我不能再把这个演绎到我自己的班级呢?如果可能的话,我想在没有显式循环遍历样本数组的情况下执行转换。我的自定义类的原因是存储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
                                    }

}

2 个答案:

答案 0 :(得分:4)

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

  

与许多HealthKit类一样,HKWorkout类不应该是   子类。您可以通过添加自定义元数据来扩展锻炼   适合您的应用的密钥。有关更多信息,请参阅   方法   的init(activityType:开始:结束:时间:totalEnergyBurned:totalDistance:元数据:)   和   的init(activityType:开始:结束:workoutEvents:totalEnergyBurned:totalDistance:元数据:)。

答案 1 :(得分:2)

@action saveMode() { axios.post('/Course/Post', { Name: "test41515"}) .then(response => { runInAction(() => { console.log(response, this.isEditing); this.isEditing = !this.isEditing; this.failedValidation = []; }); }) } 将返回HKSampleQuery的实例,因为您将HKWorkout指定为HKObjectType.workoutType()

由于HealthKit框架对您的子类一无所知,因此无法让sampleType返回HKSampleQuery的实例。

即使您已将自己的类FRWorkout声明为FRWorkout的子类,但您还没有从HKWorkout收到FRWorkout的实例,因此您无法向后转发返回的内容对象。

正如@KaneChehire指出的那样,在任何情况下,子类化HRWorkout都不是正确的方法。