Swift:如何使我的自定义struct Node <t>符合Hashable?

时间:2016-01-22 13:16:48

标签: 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 {}

// 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?

1 个答案:

答案 0 :(得分:2)

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

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

原因是Hashable继承自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"))