2017-07-08 36 views
1

有一个通用的枚举Result<T>如何在Swift中制作一个泛型枚举Equatable?

enum Result<T> { 
    case success(T) 
    case error 
} 

如何使其符合斯威夫特3或更高版本的Equatable协议?


我已经试过如下:

extension Result: Equatable { 
    static func ==<T: Equatable>(lhs: Result<T>, rhs: Result<T>) -> Bool { 
     switch (lhs, rhs) { 
     case let (.success(lhsVal), .success(rhsVal)): 
      return lhsVal == rhsVal 
     case (.error, .error): 
      return true 
     default: 
      return false 
     } 
    } 
} 

然而,这将产生一个编译器错误:Type 'Result<T>' does not conform to protocol 'Equatable'

我也试过如下:

extension Result: Equatable { 
    static func ==(lhs: Result, rhs: Result) -> Bool { 
     switch (lhs, rhs) { 
     case let (.success(lhsVal), .success(rhsVal)): 
      return lhsVal == rhsVal 
     case (.error, .error): 
      return true 
     default: 
      return false 
     } 
    } 
} 

然而,这会产生编译器错误:Binary operator '==' cannot be applied to two 'T' operands

回答

5

它有助于将通用类型限制为Equatable

enum Result<T : Equatable> { 
    case success(T) 
    case error 
} 
+0

啊,它确实有帮助。谢谢@vadian!不幸的是,这意味着我需要在'Result'枚举定义的相同项目中为'T'编写'Equatable'扩展。造成问题的原因是我只需要在我的单元测试项目中将enum设置为“Equatable”,而不是在应用程序本身中。你有没有想法如何解决这个问题,即不在主代码库中添加与Equatable单元测试相关的代码? – Alex

+0

如何让'Result'不总是需要'Equatable'? –

+0

@RodrigoRuiz如果你不需要'Equatable'省略它。 – vadian