作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个普通的 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
符合 Equatable
的类型, 接受 Result<Void>
并且仍然对 T: Equatable
使用正确的相等性检查?这对 Void
没有意义吗?实现Equatable
?
最佳答案
我认为目前还不可能。 Void
是空元组 ()
,并且元组不能采用协议(protocol)(关于该主题从 [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
}
}
无需使 Void
本身 Equatable
。
但是(再次归因于@Hamish)这行不通因为不允许多重一致性。
关于swift - 如何为通用 Result<T> 类型定义相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47606575/
我是一名优秀的程序员,十分优秀!