使用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
}
}
答案 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都不是正确的方法。