如何实现一个具有通用约束types属性的Swift协议?

我想有一个看起来像这样的协议:

protocol ReturnType { var returnType: ImmutableMappable.Type { get } } 

执行协议的枚举部分:

 extension ShimEndPoint: ReturnType { var returnType: ImmutableMappable.Type { switch self { case .deAuthorize(_, _): return EmptyResponse.self case .authorize(_, _): return AuthorizeResponse.self case .step(_, _, _, _): return StepResponse.self } } } 

EmptyResponse,AuthorizeResponse和StepResponse都实现ImmutableMappable。 现在我想在函数调用中使用“returnType”属性:

 return Shim.provider .request(endPoint) .timeout(7, scheduler: MainScheduler.asyncInstance) .retry(3) .mapObject(endPoint.returnType) 

line mapObject给了我下面的编译器错误:“不能将types'ImmutableMappable.Type'的值转换为期望的参数types'T.Type'

“mapObject”的函数签名是:

 public func mapObject<T : ImmutableMappable>(_ type: T.Type) -> RxSwift.Observable<T> 

如何定义和实现协议,以便我可以将我的returnType传递给mapObject函数?

我发现了一个类似的问题,但不幸的是,我无法通过给出的答案来解决我的问题: 从函数和方法中返回约束generics

就个人而言,我觉得你的一些代码只是没有意义。 喜欢 :

 extension ShimEndPoint: ReturnType { var returnType: ImmutableMappable.Type { switch self { case .deAuthorize(_, _): return EmptyResponse.self case .authorize(_, _): return AuthorizeResponse.self case .step(_, _, _, _): return StepResponse.self } } } 

一个物体如何根据自身来确定自身的types? 然后返回一个不同于它自己的值types?

所以我想在这里帮助的只是试图find你想要实现的解决scheme,而不是解决现有的代码。

我假设你想要做的是确定一个types的对象映射到取决于运行时的结果情况。 枚举本身是ImmutableMappable ,它有3种情况: .deauthorize.deauthorize.deauthorize

函数.request将返回这个types,并确定要映射到的types,相应的情况。 但是,由于需要在编译时确定对象的types,所以在这里所有的结果typesEmptyResponseAuthorizeResponseStepResponse都必须遵循相同的协议(我假设这里的Response ),结果也只会返回协议而不是特定的类types。

 return Shim.provider .request(endPoint) .timeout(7, scheduler: MainScheduler.asyncInstance) .retry(3) .flatMap { result: ImmutableMappable -> Observable<Response> in return Observable.create{ switch result { case .authorize: observer.onNext(AuthorizeResponse()) case .deAuthorize: //etc case step: //etc. } } } 

希望这个答案你的问题!