2017-07-14 77 views
0

如果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中實現這一點?

回答

0

閱讀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) 
} 
相關問題