协议问题中的Swift通用类型。协议只能用作一般约束

时间:2019-08-23 13:05:03

标签: ios swift generics

我已经为我的服务创建了一个协议:

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

0 个答案:

没有答案