辞書のソートをする時
let sortData = dic.sorted { $0.0 < $1.0 } .map { $0 }
を使ったのですが
{ $0.0 < $1.0 }
の意味がわかりません。また
{ $0 < $1 }
でも同じ結果が出たのですがこの二つの違いはなんでしょうか
ご教示していただけると幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
dic.sorted のリファレンス sorted(by:) の Declaration を見ると、
func sorted(by areInIncreasingOrder: ((key: Key, value: Value), (key: Key, value: Value)) throws -> Bool) rethrows -> [(key: Key, value: Value)]
となっており、dic.sorted に渡すクロージャの型は次のような関数になります。
swift
1((key: Key, value: Value), (key: Key, value: Value)) throws -> Bool
- 引数が二つで、いずれも型は (key: Key, value: Value) という 名前付きタプル
- 例外を投げることができる (クロージャが例外を投げると dic.sorted から rethrow されます)
- 戻り値は Bool
例えば dic の中身が ["Kirishima": 2, "Kyoko": 1]
の場合、このクロージャは
- 一つ目の引数 $0 は名前付きタプル
(key: "Kirishima", value: 2)
- 二つ目の引数 $1 は名前付きタプル
(key: "Kyoko", value: 1)
という引数で呼ばれます。そして名前付きタプルの場合、タプルの要素へのアプセスは名前でも連番でも可能なので、$0.0
や $1.0
は、タプルの最初の要素 ($0.key
や $1.key
と同じ) となります。
つまり、$0.0
は "Kirishima"、$1.0
は "Kyoko" なので、$0.0 < $1.0
の結果は True になり、doc.sorted { $0.0 < $1.0 }
の結果は次のようなタプルの配列になります。
swift
1let result: [(key: Key, value: Value)] = [ 2 (key: "Kirishima", value: 2), 3 (key: "Kyoko", value: 1) 4]
(ちなみに、doc.sorted { $0.1 < $1.1 }
なら key ではなく value (つまり 2 と 1) を比較することになるので、この例だと順番が逆になります。)
また。doc.sorted { $0 < $1 }
と書いた場合は、$0 や $1 はタプルなので、タプルの比較演算子 が使われます。この場合、まずタプルの最初の項目 (key) 同士を比較して、key が同じ場合には次の項目 (value) 同士を比較することになりますが、辞書の要素のため key が同じことはあり得ないので、doc.sorted { $0.0 < $1.0 }
と同じ結果になります。
ところで、dic.sorted { 〜 }
の後ろの .map { $0 }
は、あってもなくも同じ結果になると思います。
($0
のところを $0.0
や $0.1
とすれば key または value だけを取り出すことができますが…。)
投稿2021/07/16 00:09
総合スコア7901
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/16 00:28