如何实现一个具有通用约束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,所以在这里所有的结果typesEmptyResponse
, AuthorizeResponse
和StepResponse
都必须遵循相同的协议(我假设这里的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. } } }
希望这个答案你的问题!