⚖️
sortはそのままにするならfalseを返すこと
結論
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