比较具有关联类型的通用枚举

4

我有一个结果枚举和错误,如下所示:

enum Result<T>: Equatable {
  case Success(T)
  case Error(ErrorType)
}

func ==<T>(lhs: Result<T>, rhs: Result<T>) -> Bool {
  var equal: Bool = false
  switch (lhs, rhs) {
  case (.Success, .Success):
    equal = true
  case (.Error, .Error):
    equal = true
  default:
    break
  }
  return equal
}

RequestError的样子如下:

enum RequestError: String,
                   ErrorType,
                   Equatable {
  case NoInternet = "NO_INTERNET_ERROR"
  case Unknown = "UNKNOWN_ERROR"
  case ServerError = "SERVER_ERROR"
}

init?(_ error: NSError?) {
  //do init
}

func ==(lhs: RequestError, rhs: RequestError) -> Bool {
  return lhs.rawValue == rhs.rawValue
}

我正在使用Quick+Nimble编写规范文档, 内容如下:
class ResultSpec: QuickSpec {
  override func spec() {

    describe("Result") {

      context("when comparing 2 success results") {

        it("returns true") {
          let equal = Result.Success(5) == Result.Success(5)
          expect(equal).to(beTrue())
        }

      }

      context("when comparing 2 error results") {

        it("returns true") {
          let error = NSError(domain: "", code: 0, userInfo: nil)
          let requestError = RequestError(error)!
          let equal = Result.Error(requestError) == Result.Error(requestError)
          expect(equal).to(beTrue())
        }

      }

    }

  }
}

第一个测试检查成功通过。第二个测试由于以下错误无法编译:

二元运算符“==”不能应用于两个“Result<_>”操作数

出错的位置是这一行:

let equal = Result.Error(requestError) == Result.Error(requestError)
1个回答

2

我相信编译器告诉您,它不知道应该使用哪种类型来执行通用的Result枚举==操作。 您可以将此行替换为任何直接类型规范,因为在这里类型不起作用。 就像这样:

let equal = Result<String>.Error(requestError) == Result<String>.Error(requestError)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接