我试图创建一个通用的fetch函数来从Core Data中提取任何实体,然后将其转换为我的一个数据传输对象。但我被如何从我的协议DTO
转换为DTO
的特定实现所困。
public func getEntity<T: DTOConvertible, Y: DTO>(CDtype: T.Type, id: CVarArg, DTOType: Y.Type) -> Y.Type {
let request = T.fetchRequest() as! NSFetchRequest<T>
request.fetchLimit = 1
let predicate = NSPredicate(format: "id == %@", id)
request.predicate = predicate
guard let entityCD = try? moc.fetch(request).first else { return Y.GetDefaultInstance() as! Y.Type }
return entityCD.ToDTO() as! Y.Type //error here
}
我已经将DTOConvertible
协议添加到Core Data类中,以添加ToDTO()
转换器函数。
protocol DTOConvertible: NSManagedObject {
func ToDTO() -> any DTO
}
extension ExerciseCD : Identifiable, DTOConvertible {
public func ToDTO() -> DTO {
return Exercise(ExerciseId: self.exerciseId, ExerciseName: self.exerciseName)
}
}
我的所有DTO结构都符合DTO
协议。
public protocol DTO {
static func GetDefaultInstance() -> Self
}
public struct Exercise: Codable, Identifiable, DTO {
public var id: String { return ExerciseId }
public var ExerciseId: String
public var ExerciseName: String
public static func GetDefaultInstance() -> Exercise {
return Exercise(ExerciseId: "", ExerciseName: "")
}
}
如果我在ExerciseCD
上更改ToDTO()
的实现以返回Exercise
(特定的DTO),那么编译器会抱怨ExerciseCD
不符合DTOConvertible
协议。但是即使Exercise
符合DTO
,我也不能从DTO
转换为Exercise
。有没有办法解决这个问题?
1条答案
按热度按时间syqv5f0l1#
您可以使用
T.SomeTypeAlias
来代替Y
。然后在
getEntity
中那么实体只需要一个微小的改变