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
    }
}