大佬教程收集整理的这篇文章主要介绍了ios – 如何使用通用约束类型属性实现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给出了以下编译器错误:
“无法将’ImmutableMappable.Type’类型的值转换为预期的参数类型’T.Type’
public func mapObject<T : ImmutableMappable>(_ type: T.TypE) -> RxSwift.observable<T>
如何定义和实现协议,以便将returnType传递给mapObject函数?
我发现了一个类似的问题,但不幸的是,在给出的答案的帮助下,我无法解决我的问题:
Returning constrained generics from functions and methods
extension ShimEndPoint: ReturnType { var returnType: ImmutableMappable.Type { switch self { case .deAuthorize(_,_): return StepResponse.self } } }
对象如何根据自身确定自身的类型?然后返回一个与自身不同的值类型?
所以我在这里试图帮助的只是试图找到你想要实现的解决方案,而不是解决现有的代码.
我假设您尝试做的是确定要映射到的对象类型取决于运行时的结果案例.枚举本身是ImmutableMappable,它有3种情况:.authorize,.deauthorize和.step.
函数.request将返回此类型,并根据情况确定要映射到的类型.但是,由于对象的类型需要在编译时确定,所以这里的所有结果类型EmptyResponse,AuthorizeResponse和StepResponse必须遵循相同的协议(我假设,响应在这里),结果也只返回协议而不是特定的班级类型.
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. } } }
希望这能回答你的问题!
以上是大佬教程为你收集整理的ios – 如何使用通用约束类型属性实现Swift协议?全部内容,希望文章能够帮你解决ios – 如何使用通用约束类型属性实现Swift协议?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。