如何为通用 Result<T> 类型定义相等性?
How do I define equality for a generic Result<T> type?
我有一个简单的 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
。有没有一种方法可以定义符合 Equatable
、接受 Result<Void>
并且仍然对 T: Equatable
使用正确的相等性检查的 Result
类型? Void
实施 Equatable
没有意义吗?
我认为目前还不可能。 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)这行不通
因为不允许多重一致性。
我有一个简单的 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
。有没有一种方法可以定义符合 Equatable
、接受 Result<Void>
并且仍然对 T: Equatable
使用正确的相等性检查的 Result
类型? Void
实施 Equatable
没有意义吗?
我认为目前还不可能。 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)这行不通 因为不允许多重一致性。