如何使 Swift 中的通用枚举相等?
How to make a generic enum Equatable in Swift?
有一个通用枚举Result<T>
enum Result<T> {
case success(T)
case error
}
如何使其符合 Swift 版本 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
将通用类型限制为 Equatable
是否有帮助?
enum Result<T : Equatable> {
case success(T)
case error
}
写这个扩展而不实现:
extension Result: Equatable where T: Equatable {}
当T
符合Equatable
时,Result<T>
会自动符合Equatable
。
有一个通用枚举Result<T>
enum Result<T> {
case success(T)
case error
}
如何使其符合 Swift 版本 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
将通用类型限制为 Equatable
是否有帮助?
enum Result<T : Equatable> {
case success(T)
case error
}
写这个扩展而不实现:
extension Result: Equatable where T: Equatable {}
当T
符合Equatable
时,Result<T>
会自动符合Equatable
。