Почему сортировка массивов перечислений с помощью Swift 5 дает разные результаты? - PullRequest
0 голосов
/ 28 марта 2019

Я не знаю, является ли это ошибкой или функцией, но сортировка массивов перечислений дает разные результаты при каждом запуске.Вот базовый код для его проверки.

enum Tag: String {
    case bold, italic, underline
}

extension Tag: Comparable {
    static func <(lhs: Tag, rhs: Tag) -> Bool {
        return lhs.hashValue < rhs.hashValue
    }
}

let tags:[Tag] = [.bold, .italic, .underline].sorted()
print(tags.map {$0.rawValue})

Ответы [ 2 ]

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

Простой ответ:

В вашем примере вы сравниваете, используя hashValue из String. Алгоритмы хэширования Swift 5 отличаются от алгоритмов Swift 4.

Ответ, который вы ищете:

Не сортируйте строки (или любые другие типы) по их хешам, это не то, что вы ищете. То, что вы ищете, это это .

Реализация, которую вы хотите, вероятно, такова:

extension Tag: Comparable {
    static func <(lhs: Tag, rhs: Tag) -> Bool {
        return lhs.rawValue < rhs.rawValue
    }
}

rawValue является необработанным String значением перечисления.

Хеш-значение является произведением хеш-функции , которая абсолютно не связана с сортировкой.

Информация о бонусе:

Для тех проницательных наблюдателей, которые задаются вопросом, почему хэш-значения различаются при каждом прогоне Свифта, здесь - разбивка.

1 голос
/ 28 марта 2019

Уверен, это из-за этого :

Не гарантируется, что значения хеша будут одинаковыми при разных исполнениях вашей программы. Не сохраняйте значения хешей для использования в будущем выполнение.

Если вы измените метод сравнения на:

return lhs.rawValue < rhs.rawValue

это должно сработать.

...