Ios 把我的训练交给我的定制课程

Ios 把我的训练交给我的定制课程,ios,swift,casting,healthkit,Ios,Swift,Casting,Healthkit,使用Swift 4.0,我尝试在内置的HealhKit类HK训练和我自己的定制类之间进行向下转换。我的班级继承了香港的传统。HK训练从HKSample继承而来。从香港样板作品向下投射到香港训练。那么,为什么我不能把它进一步传给我自己的班级呢?如果可能的话,我希望在不显式循环样本数组的情况下执行强制转换。我的自定义类用于存储addl属性和方法 //This works. Note I am not explicitly looping over samples array. //samples i

使用Swift 4.0,我尝试在内置的HealhKit类HK训练和我自己的定制类之间进行向下转换。我的班级继承了香港的传统。HK训练从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]
最终目标是获得一组FRKUST对象,而不是HHKUST对象

以下是完整的上下文:

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
                                    }

}

根据文档,子类化是不可取的,因此在进一步研究之前探索其他方法可能是一个好主意

像许多健康套件课程一样,香港健身班不应该 子类。您可以通过添加自定义元数据来扩展训练 适用于您的应用程序的密钥。有关更多信息,请参阅 方法 初始化(activityType:开始:结束:持续时间:totalEnergyBurned:totalDistance:元数据:) 和 初始化(activityType:start:end:workoutEvents:totalEnergyBurned:totalDistance:metadata:)


根据文档,子类化是不可取的,因此在进一步研究之前探索其他方法可能是一个好主意

像许多健康套件课程一样,香港健身班不应该 子类。您可以通过添加自定义元数据来扩展训练 适用于您的应用程序的密钥。有关更多信息,请参阅 方法 初始化(activityType:开始:结束:持续时间:totalEnergyBurned:totalDistance:元数据:) 和 初始化(activityType:start:end:workoutEvents:totalEnergyBurned:totalDistance:metadata:)


HKSampleQuery
将返回
HKWorkout
的实例,因为您将
HKObjectType.workoutType()
指定为
sampleType

由于HealthKit框架对您的子类一无所知,因此您无法使用
HKSampleQuery
返回
FRWorkout
的实例

即使您已将自己的类,
FRWorkout
声明为
HKWorkout
的子类,您也不会从
HKSampleQuery
接收到
FRWorkout
的实例,因此无法向下转换返回的对象


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

HKSampleQuery
将返回
HKWorkout
的实例,因为您将
HKObjectType.workoutType()
指定为
sampleType

由于HealthKit框架对您的子类一无所知,因此您无法使用
HKSampleQuery
返回
FRWorkout
的实例

即使您已将自己的类,
FRWorkout
声明为
HKWorkout
的子类,您也不会从
HKSampleQuery
接收到
FRWorkout
的实例,因此无法向下转换返回的对象


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

样本从何而来?在哪里/如何申报?由于HKSample是从HKWORK继承而来,因此您可以将其转换为HKWORK。FRXOUTPUT不是从HKSample继承的,因此您不能在这些类之间进行强制转换。此外,强制从超类向下转换到子类是有风险的,除非您确定该对象实际上是该子类的实例;从HKWORK实例到FRWORK实例的强制向下转换将崩溃样本来自HKQuery:
let sortDescriptor=NSSortDescriptor(键:HKSampleSortIdentifierEndDate,升序:false)let query=HKSampleQuery(样本类型:HKObjectType.workoutType(),谓词:nil,limit:50,sortDescriptors:[sortDescriptor]){{{//access samples here}中的(查询、样本、错误)
samples来自何处?它在何处/如何声明?由于HKSample继承自HKCURROUT,您可以强制转换到HKCURROUT。FRCURROUT不继承自HKSample,因此您不能在这些类之间强制转换。此外,除非您确定对象实际上是s子类的一个实例;从HKWORK实例到FRWORK实例的强制向下转换将崩溃示例来自HKQuery:
let sortDescriptor=NSSortDescriptor(键:HKSampleSortIdentifierEndDate,升序:false)let query=HKSampleQuery(sampleType:HKObjectType.workoutType(),谓词:nil,limit:50,sortDescriptors:[sortDescriptor]){{{//access samples here}中的(查询、样本、错误)
Ok。我用一个结构作为包装来保存我的地址信息和训练对象,从而解决了我的问题。
public struct WorkoutWrapper{public var-workout:HKWorkout!public var-myCustomCounter:UInt=0}
为什么不使用HKWorkout已经支持的自定义键呢?不要重新发明轮子:)看看我在回答OK中链接到的文档。我通过使用结构作为包装来保存我的addl信息和训练对象,从而解决了我的问题。
public struct WorkoutWrapper{public var-workout:HKWorkout!public var-myCustomCounter:UInt=0}
为什么不使用“香港健身计划”已经支持的自定义键?不要重新发明轮子:)看看我在回答中链接的文档