我已经为我的服务创建了一个协议:
protocol SaveCoreDataObjectServiceProtocol {
associatedtype T
func getPending() -> T?
func deletePending(with completion: @escaping (ResultInfo<Bool>) -> Void)
}
我有一个基类,它将成为所有子服务的父类:
class BaseSaveCoreDataObjectService<T: DynamicObject>: SaveCoreDataObjectServiceProtocol {
func getPending() -> T? {
let managedObject = try? CoreStore.fetchOne(
From<T>()
.where(
format: "%K == %@",
#keyPath(BaseMO.pendingToSave),
NSNumber(value: true))
)
return managedObject
}
func deletePending(with completion: @escaping (ResultInfo<Bool>) -> Void) {
let managedObject = try? CoreStore.fetchOne(
From<T>()
.where(
format: "%K == %@",
#keyPath(BaseMO.pendingToSave),
NSNumber(value: true))
)
if let unwrappedManagedObject = managedObject {
CoreStore.perform(
asynchronous: { (transaction) -> Void in
transaction.delete(unwrappedManagedObject)
print("Deleted pending object id: ", (unwrappedManagedObject as? BaseMO)?.id ?? "Deleting pending object with no id issue.")
},
completion: { _ in
completion(ResultInfo.data(true))
}
)
}
} }
我很少有服务是从BaseSaveCoreDataObjectService
继承而来的
class SaveWorkoutService : BaseSaveCoreDataObjectService<WorkoutEntity> {
}
class SaveExerciseService: BaseSaveCoreDataObjectService<ExerciseEntity> {
}
当我尝试迭代它们时,在这里出现错误Protocol type 'DynamicObject' cannot conform to 'DynamicObject' because only concrete types can conform to protocols
:
func removeAllPendingCoreDataObjectsToSave() {
let saveObjectServices = [SaveExerciseService(), SaveWorkoutService()] as [BaseSaveCoreDataObjectService<DynamicObject>]
for saveObjectService in saveObjectServices {
saveObjectService.deletePending { (result) in
}
}
}
想法只是拥有基本的父服务,其中包括一些可重用的功能,例如getPending()
deletePending()
等,并且可以返回通用类型。
如果我更改了
let saveObjectServices = [SaveExerciseService(), SaveWorkoutService()] as [BaseSaveCoreDataObjectService<DynamicObject>]
对此:
let saveObjectServices = [SaveExerciseService(), SaveWorkoutService()] as [SaveCoreDataObjectServiceProtocol]
我收到此错误:
Protocol 'SaveCoreDataObjectServiceProtocol' can only be used as a generic constraint because it has Self or associated type requirements