我有一个普通的类型:
public enum Result<T> {
case success(T)
case error
}
我想让类型
Result
足够简单:public enum Result<T: Equatable>: Equatable {
case success(T)
case error
// definition of ==
}
但是我想使用
Equatable
,这是一个类型错误,因为Result<Void>
不符合Void
。有没有一种方法可以定义一个符合Equatable
的Result
类型,接受Equatable
并仍然对Result<Void>
使用正确的相等性检查?实现T: Equatable
是否有意义? 最佳答案
我认为目前不可能。Void
是
空元组,元组不能采用协议(关于
该主题从[swift-evolution] Synthesizing Equatable, Hashable, and Comparable for tuple types开始。
可能的解决方法(如上面@hamish所建议的)是使用自定义
键入而不是()
:
struct Unit: Equatable {
static var unit = Unit()
public static func ==(lhs: Unit, rhs: Unit) -> Bool {
return true
}
}
let res = Result.success(Unit.unit)
我最初认为,一旦实现了SE-0143 Conditional conformances
public enum Result<T> {
case success(T)
case error
}
public extension Result: Equatable where T: Equatable {
public static func ==(lhs: Result, rhs: Result) -> Bool {
// ...
}
}
public extension Result: Equatable where T == Void {
public static func ==(lhs: Result, rhs: Result) -> Bool {
return true
}
}
不需要品牌本身。
但是(同样归属于@hamish)这不起作用
因为不允许多个符合项。