代码之家  ›  专栏  ›  技术社区  ›  Krunal

Swift:“Hashable.hashValue”作为协议要求已被弃用;

  •  -1
  • Krunal  · 技术社区  · 5 年前

    作为协议要求,“Hashable.hashValue”已被弃用;请改为通过实现“hash(into:)”将类型“ActiveType”转换为“Hashable”

    • Xcode代码10.2
    • 斯威夫特5

    源代码:

    public enum ActiveType {
        case mention
        case hashtag
        case url
        case custom(pattern: String)
    
        var pattern: String {
            switch self {
            case .mention: return RegexParser.mentionPattern
            case .hashtag: return RegexParser.hashtagPattern
            case .url: return RegexParser.urlPattern
            case .custom(let regex): return regex
            }
        }
    }
    
    extension ActiveType: Hashable, Equatable {
        public var hashValue: Int {
            switch self {
            case .mention: return -1
            case .hashtag: return -2
            case .url: return -3
            case .custom(let regex): return regex.hashValue
            }
        }
    }
    

    enter image description here

    有更好的解决办法吗?警告本身建议我实现“hash(into:)”但我不知道,如何实现?

    ActiveLabel

    1 回复  |  直到 5 年前
        1
  •  47
  •   Rico Crescenzio    5 年前

    正如警告所说,现在您应该实现 hash(into:) 改为函数。

    func hash(into hasher: inout Hasher) {
        switch self {
        case .mention: hasher.combine(-1)
        case .hashtag: hasher.combine(-2)
        case .url: hasher.combine(-3)
        case .custom(let regex): hasher.combine(regex) // assuming regex is a string, that already conforms to hashable
        }
    }
    

    提示:不需要使枚举显式符合 Equatable 因为 Hashable 扩展它。