Swift:如何创建自定义结构节点<;T>;是否符合哈希表?

Swift:如何创建自定义结构节点<;T>;是否符合哈希表?,swift,generics,hashable,Swift,Generics,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 {}

节点是泛型类型

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
}
struct节点:可散列{
变量标签:T
初始(uu标签:T){
self.label=标签
}
var hashValue:Int{
得到{
返回label.hashValue
}
}
}
扩展节点:可等式{}
//马克:相等
func==(左:节点,右:节点)->Bool{
返回lhs.label==rhs.label
}
但当我尝试以下方法时,它不起作用:

let nodes = Set<Node<String>>()
let nodes=Set()

编译器抱怨
节点
不符合Hashable。如何使
节点
符合Hashable?

您还必须将
=
方法作为结构的
equalable
协议的一部分来实现:

func ==<T, K>(lhs:Node<T>, rhs:Node<K>) -> Bool {
    return lhs.hashValue == rhs.hashValue
}

更新问题。我确实实现了==。@黄超你不应该根据答案改变你的问题。它解决了问题吗?对我来说是的。不需要
扩展名
顺便说一句。@HuangChao那么你做错了,
=
必须在顶级定义,而不是在类或其他任何内容中,基本上就在import语句的下面。事实证明,问题与哈希内容无关。这是Xcode问题。我只做了清理,但没有构建,所以XCode甚至没有注意到节点现在是可散列的。是的。谢谢你的帮助。
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"))