【问题标题】:Swift: how to make my custom struct Node<T> conform to Hashable?Swift:如何使我的自定义结构 Node<T> 符合 Hashable?
【发布时间】:2016-01-22 13:16:48
【问题描述】:

Node 是一个泛型类型。

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&lt;String&gt; 不符合 Hashable。如何让Node&lt;String&gt;符合Hashable?

【问题讨论】:

    标签: swift generics hashable


    【解决方案1】:

    您还必须为您的结构实现== 方法作为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"))
    

    【讨论】:

    • 更新问题。我确实实现了 ==。
    • @HuangChao 你不应该根据答案改变你的问题。它解决了问题吗?对我来说确实如此。不需要extension btw。
    • @HuangChao 那你做错了,== 必须在顶层定义,而不是在类或其他任何东西中,基本上就在 import 语句的下方。
    • 原来问题与 Hashable 的东西无关。这是Xcode的问题。我只清理但没有构建,所以 XCode 甚至没有注意到 Node 现在是 Hashable。
    • 是的。感谢您的帮助。
    猜你喜欢
    • 2015-10-04
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2017-07-11
    • 1970-01-01
    相关资源
    最近更新 更多