⚖️

sortはそのままにするならfalseを返すこと

2025/01/30に公開

結論

players.sort {
    //$0 vs $1を調べるコード
    return ?
}

2通りの解釈がある。

【A】現在$0 $1という順番になっていますがそれでいいですか?
【B】$0 $1という順番にする案に賛成ですか?

比較したい事柄について$0と$1が同等の場合、Aの解釈で気軽にtrueを返すと実は裏ではBが行われているのでひっくり返ってしまう。

コード

もともとは比較項目がいろいろあって必ず前後関係が決定するものだった。後にhomerunだけで良いと言われて他を削るが、「現在の順番でいいかどうか聞いているんだろう」と解釈して最後の return true を見逃してしまう。

struct Player {
    let id: Int
    let name: String
    let average: Double
    let homerun: Int
    let point: Int
}

var players = [
    Player(id: 1, name: "A", average: 0.292, homerun: 23, point: 67),
    Player(id: 2, name: "B", average: 0.292, homerun: 23, point: 67)
]

players.sort {
    if $0.homerun > $1.homerun { return true}
    else if $0.homerun < $1.homerun { return false}
/*
    if $0.average > $1.average { return true}
    else if $0.average < $1.average { return false}
    if $0.point > $1.point { return true}
    else if $0.point < $1.point { return false}
    if $0.id < $1.id { return true}
    else if $0.id > $1.id { return false}
*/
    return true
}

print(players) //出力は [B, A]

結果はひっくり返り[B, A]となる。
知らないうちに順番が入れ替わり、挙動が思っているものと違ってくる。

ひっくり返す理由がないなら false が正しい。

Discussion