首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift中的Hashable枚举

Swift中的Hashable枚举
EN

Stack Overflow用户
提问于 2016-05-16 21:16:48
回答 1查看 5.4K关注 0票数 5

我希望有一个包含两个case的枚举,每个case都有一个Hashable关联类型,每个都符合Hashable,如下所示:

代码语言:javascript
复制
enum WordOrNumber {
    case Word(String)
    case Number(Int)
}

我对哈希的第一个想法是:

代码语言:javascript
复制
extension WordOrNumber: Hashable {
    var hashValue: Int {
        switch self {
            case let .Word(word): 
                return word.hashValue & ~1 // ends in 0
            case let .Number(number):
                return number.hashValue | 1 // ends in 1
        }
    }
}

我不确定的是,这将如何与Swift的Dictionary和Set实现中的bucket交互。

通过LSB或MSB来区分这两种情况更好,还是通过介于两者之间的某处来区分更好?

我假设将hashValues左移1然后再加1没有任何区别,但我很有兴趣知道情况是否如此。

编辑:我刚刚测试了一下,看起来Int的hashValue就是值本身。这显然是一个问题,因为您经常会连续获得Int,就像在枚举Bla: Int {}中一样。所以我的新的和改进的(?)hashValue是:

代码语言:javascript
复制
extension WordOrNumber: Hashable {
    var hashValue: Int {
        switch self {
            case let .Word(word): // ends in 0
                return word.hashValue << 1
            case let .Number(number): // ends in 1
                return number.hashValue << 1 &+ 1
        }
    }
}

上面关于LSB和MSB的问题仍然存在。

EN

回答 1

Stack Overflow用户

发布于 2018-02-10 06:20:54

有这样的东西:

代码语言:javascript
复制
extension WordOrNumber: Hashable {
    var hashValue: Int {
        switch self {
        case .Word(let value):
            return value.hashValue
        case .Number(let value):
            return value.hashValue
        }
    }

    static func ==(lhs: WordOrNumber, rhs: WordOrNumber) -> Bool {
        switch (lhs, rhs) {
        case (.Word(let lhsValue), .Word(let rhsValue)):
            return lhsValue == rhsValue
        case (.Number(let lhsValue), .Number(let rhsValue)):
            return lhsValue == rhsValue
        default:
            return false
        }
    }
}

..。应该足够了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37254890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档