Swift:如何使我的自定义结构 Node<T> 符合 Hashable?
Swift: how to make my custom struct Node<T> conform to Hashable?
节点是通用类型。
struct Node<T: Hashable>: Hashable {
var label: T
init(_ label: T) {
self.label = label
}
var hashValue : Int {
get {
return label.hashValue
}
}
}
extension Node : Equatable {}
// MARK: Equatable
func ==<T>(lhs: Node<T>, rhs: Node<T>) -> Bool {
return lhs.label == rhs.label
}
但是当我尝试以下操作时它不起作用:
let nodes = Set<Node<String>>()
编译器抱怨 Node<String>
不符合 Hashable。如何让Node<String>
符合Hashable?
您还必须为您的结构实现 ==
方法作为 Equatable
协议的一部分:
func ==<T, K>(lhs:Node<T>, rhs:Node<K>) -> Bool {
return lhs.hashValue == rhs.hashValue
}
原因是 Hashable
inherits from Equatable
。
以下是一个完整的工作游乐场示例:
struct Node<T: Hashable> : Hashable {
var label: T
init(_ label: T) {
self.label = label
}
var hashValue : Int {
get {
return label.hashValue
}
}
}
func ==<T>(lhs:Node<T>, rhs:Node<T>) -> Bool {
return lhs.hashValue == rhs.hashValue
}
var nodes = Set<Node<String>>()
nodes.insert(Node("hi"))
nodes.insert(Node("ho"))
nodes.insert(Node("hi"))
节点是通用类型。
struct Node<T: Hashable>: Hashable {
var label: T
init(_ label: T) {
self.label = label
}
var hashValue : Int {
get {
return label.hashValue
}
}
}
extension Node : Equatable {}
// MARK: Equatable
func ==<T>(lhs: Node<T>, rhs: Node<T>) -> Bool {
return lhs.label == rhs.label
}
但是当我尝试以下操作时它不起作用:
let nodes = Set<Node<String>>()
编译器抱怨 Node<String>
不符合 Hashable。如何让Node<String>
符合Hashable?
您还必须为您的结构实现 ==
方法作为 Equatable
协议的一部分:
func ==<T, K>(lhs:Node<T>, rhs:Node<K>) -> Bool {
return lhs.hashValue == rhs.hashValue
}
原因是 Hashable
inherits from Equatable
。
以下是一个完整的工作游乐场示例:
struct Node<T: Hashable> : Hashable {
var label: T
init(_ label: T) {
self.label = label
}
var hashValue : Int {
get {
return label.hashValue
}
}
}
func ==<T>(lhs:Node<T>, rhs:Node<T>) -> Bool {
return lhs.hashValue == rhs.hashValue
}
var nodes = Set<Node<String>>()
nodes.insert(Node("hi"))
nodes.insert(Node("ho"))
nodes.insert(Node("hi"))