我有一个简单的Result
类型:
public enum Result<T> {
case success(T)
case error
}
我想制作类型Equatable
,这很简单:
public enum Result<T: Equatable>: Equatable {
case success(T)
case error
// definition of ==
}
但后来我想使用Result<Void>
,这是一个类型错误,因为Void
不符合Equatable
。有没有办法定义符合Result
的{{1}}类型,接受Equatable
并仍然使用Result<Void>
的正确等式检查? T: Equatable
实施Void
是否有意义?
答案 0 :(得分:2)
我认为目前无法做到这一点。 Void
是的类型
空元组()
,元组不能采用协议(关于
该主题从[swift-evolution] Synthesizing Equatable, Hashable, and Comparable for tuple types开始。
可能的解决方法(如上面@Hamish所建议的)是使用自定义
键入而不是Void
:
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
}
}
不需要make Void
本身Equatable
。
然而(再次归属于@Hamish)这不会起作用 因为不允许多种一致性。