gpt4 book ai didi

swift - swift : supply default hashValue in a protocol? 中的 api 设计

转载 作者:行者123 更新时间:2023-11-28 12:58:41 25 4
gpt4 key购买 nike

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

protocol GraphEdge: Hashable {
typealias Vertex
var v1: Vertex {get}
var v2: Vertex {get}
}

(协议(protocol)不能有泛型,所以我使用关联类型)。我想提供一个默认的 == 运算符,所以我这样实现它:

func ==<E: GraphEdge where E.Vertex: Equatable>(e1: E, e2: E) -> Bool {
return e1.v1 == e2.v1 && e1.v2 == e2.v2
}

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

在我目前的实现中,实现协议(protocol)的类也必须实现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}
}

最佳答案

看起来你的 Vertex 类型符合 Hashable 协议(protocol),所以你可以做..

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 作为两个顶点的哈希值之和返回可能不是理想的解决方案

关于swift - swift : supply default hashValue in a protocol? 中的 api 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com