2016-11-22 2 views
4

Я хотел бы иметь протокол, который выглядит примерно так:Как реализовать протокол 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) 

Линия MapObject дает мне следующую ошибку компилятора: «Невозможно преобразовать значение типа„“ImmutableMappable.Type ожидаемого типа аргумента «T.Type»

функция подписи «MapObject» является:

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

Как определить и реализовать протокол, так что я могу передать в моей ReturnType к mapObj функция ect?

Я нашел подобный вопрос, но, к сожалению, я не мог решить мою проблему с помощью ответа Дано: Returning constrained generics from functions and methods

ответ

0

Лично я чувствую, что некоторые из кода просто не имеет смысла. Например:

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

Как объект может определить тип самого себя на основе самого себя? А затем верните тип значения, отличный от самого себя?

Так что я пытаюсь помочь здесь, просто пытаюсь найти решение того, чего вы пытаетесь достичь, вместо того, чтобы решать существующий код.

Я предполагаю, что то, что вы пытаетесь сделать, определяется типом объекта для сопоставления, зависит от результата результата во время выполнения. Перечислением является ImmutableMappable и имеет 3 случая: .authorize, .deauthorize и .step.

Функция .request вернет этот тип и определит тип для сопоставления, в зависимости от случая. Однако, поскольку тип объекта должен быть определен во время компиляции, все результаты типа EmptyResponse, AuthorizeResponse и StepResponse здесь должны соответствовать одному протоколу (я предполагаю, что Response здесь), и результат также будет возвращать только протокол, а не конкретный тип класса.

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. 
      } 
     } 
    } 

Надеюсь, что ответьте на ваш вопрос!

Смежные вопросы