swift中的api设计:在协议中提供默认哈希值?
还在学习斯威夫特。。。在为图边设计类时,我想抽象并使其成为协议:swift中的api设计:在协议中提供默认哈希值?,swift,generics,Swift,Generics,还在学习斯威夫特。。。在为图边设计类时,我想抽象并使其成为协议: protocol GraphEdge: Hashable { typealias Vertex var v1: Vertex {get} var v2: Vertex {get} } (协议不能有泛型,所以我使用关联类型)。 我想提供一个默认的==操作符,因此我用以下方式实现它: func ==<E: GraphEdge where E.Vertex: Equatable>(e1: E, e2
protocol GraphEdge: Hashable {
typealias Vertex
var v1: Vertex {get}
var v2: Vertex {get}
}
(协议不能有泛型,所以我使用关联类型)。
我想提供一个默认的==
操作符,因此我用以下方式实现它:
func ==<E: GraphEdge where E.Vertex: Equatable>(e1: E, e2: E) -> Bool {
return e1.v1 == e2.v1 && e1.v2 == e2.v2
}
看起来您的顶点类型符合哈希协议,所以您可以这样做
protocol GraphEdge: Hashable {
typealias Vertex: Hashable
var v1: Vertex {get}
var v2: Vertex {get}
}
extension GraphEdge {
var hashValue: Int {
return v1.hashValue + v2.hashValue
}
}
请注意,将hasValue作为两个顶点的hashValues之和返回可能不是理想的解决方案即将发布相同的解决方案:)–但您应该将hash值与
^
或&+
结合起来,以避免整数溢出。@Martin R ha,我刚刚编辑了关于hashVale:-)的答案。看起来像一场比赛。。。。你的便条对这家伙很有帮助!请注意,在Swift中,整数算术溢出会导致运行时错误。
protocol GraphEdge: Hashable {
typealias Vertex: Hashable
var v1: Vertex {get}
var v2: Vertex {get}
}
extension GraphEdge {
var hashValue: Int {
return v1.hashValue + v2.hashValue
}
}