在协议扩展子句中使用不带参数的泛型类型

问题描述:

如果associatedtype EResult<T>,我想使用函数扩展协议。我想达到的是类似于以下内容:在协议扩展子句中使用不带参数的泛型类型

extension SharedSequenceConvertibleType where E == Result { 

    func filterResult(success: Bool) -> RxCocoa.SharedSequence<Self.SharingStrategy, Self.E> { 
     return self.filter { result in 
      switch (result) { 
      case .Success(_): 
       return success 
      case .Failure(_): 
       return !success 
      } 
     } 
    } 
} 

enum Result<Element> { 
    case Success(Element) 
    case Failure(Swift.Error) 
} 

不幸的是,斯威夫特抱怨Reference to generic type 'Result' requires arguments in <…>。如果我使用建议的Fix-It将其更改为Result<Any>,则不能在Result<MyObject>'Result<LoginInfo>' is not convertible to 'Result<Any>'上使用filterResult。正如你所看到的,我实际上并不关心Element这个类型。

有没有办法在Swift 3中实现这一点?

阅读this thread之后,我想,这似乎是neccessary使用协议包Result<Element>以下工作:

extension SharedSequenceConvertibleType where E: ResultType { 

    func filterResult(success: Bool) -> RxCocoa.SharedSequence<Self.SharingStrategy, Self.E> { 
     return filter { result in return success == result.isSuccess } 
    } 
} 


protocol ResultType { 
    var isSuccess: Bool { get } 
} 

enum Result<Element>: ResultType { 
    var isSuccess: Bool { 
     switch self { 
     case .Success: 
      return true 
     default: 
      return false 
     } 
    } 

    case Success(Element) 
    case Failure(Swift.Error) 
}