swift中的api设计:在协议中提供默认的hashValue?

时间:2015-12-20 16:58:50

标签: swift generics

仍在学习Swift ......在为图形边缘设计类时,我想抽象并使其成为协议:

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
}

是否正确(从设计的角度来看)? 如何以类似的方式实现默认的hashValue: Int成员? 它无法声明为协议本身......

在我目前的实现中,实现协议的类也必须实现hashValue: Int,但它会导致非常重复的代码:

struct Edge<V: Hashable>: GraphEdge {
    let v1, v2: V
    var hashValue: Int {return v1.hashValue + v2.hashValue}
}

struct WeightedEdge<V: Hashable>: GraphEdge {
    let v1, v2: V
    let w: Float
    var hashValue: Int {return v1.hashValue + v2.hashValue}
}

0 个答案:

没有答案