Swift: Hashable.hashValue устарел как требование протокола; - PullRequest
11 голосов
/ 28 марта 2019

Я столкнулся со следующей проблемой (это всего лишь предупреждение) с моим проектом iOS.

Hashable.hashValue устарел как требование протокола;Примените тип 'ActiveType' к 'Hashable', внедрив вместо него 'hash (into :)'

  • Xcode 10.2
  • Swift 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 Ответ

29 голосов
/ 28 марта 2019

Как сказано в предупреждении, теперь вы должны вместо этого реализовать функцию 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
    }
}

СОВЕТ: вам не нужно явно указывать enum для Equatable, поскольку Hashable расширяетсяэто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...