0

I don't know whether it is a bug or a feature but sorting array of enums give different result with each run. Here is a basic code to test it.

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

2 に答える 2

2

簡単な答え:

あなたの例ではhashValue、 a のを使用して比較していStringます。Swift 5 のハッシュ アルゴリズムは、Swift 4 のハッシュ アルゴリズムとは異なります。

あなたが探している答え:

ハッシュに基づいて文字列(またはそのタイプ)をソートしないでください。探しているものではありません。あなたが探しているのはこれです。

あなたが望む実装はおそらくこれです:

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

rawValueString列挙型の生の値です。

ハッシュ値は、ソートとはまったく関係のないハッシュ関数の積です。

ボーナス情報:

なぜ Swift の実行ごとにハッシュ値が異なるのか疑問に思っている鋭い観察者のために、ここにその内訳を示します。

于 2019-03-28T19:47:01.347 に答える