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