2017-07-08 64 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