web-dev-qa-db-ja.com

Swift: 'Hashable.hashValue'はプロトコル要件として廃止されました。

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

enter image description here

より良い解決策はありますか? 「ハッシュ(into :)」の実装を勧める警告自体ですが、どうすればよいですか?

リファレンス: ActiveLabel

25
Krunal

警告が言うように、今度は代わりに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はenumを拡張するため、列挙型を明示的にHashableに準拠させる必要はありません。

48
Rico Crescenzio