仍在学习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}
}