42

我的 iOS 项目一直面临以下问题(这只是一个警告)。

'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
        }
    }
}

在此处输入图像描述

有更好的解决方案吗?警告本身建议我实施 'hash(into:)' 但我不知道,怎么做?

参考:活动标签

4

1 回答 1

70

正如警告所说,现在您应该实现该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
    }
}

hash(into:)删除自定义实现(除非您需要特定实现)会更好(在枚举和结构的情况下),因为编译器会自动为您合成它。

只需让您的枚举符合它:

public enum ActiveType: Hashable {
    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
        }
    }
}
于 2019-03-28T10:30:24.800 回答