

辞書をソートした後に配列に変換したいのですが、以下のコードでエラーが出てしまいます。

`self.cards = sortedDic.map { $0.value }`
の行をコメントアウトしても同様のエラーが出るのですが、`sorted(by: <)`という書き方は他のところでも利用していて無事に動いています。

**エラーメッセージ**

[code]

    Command failed due to signal: Illegal instruction: 4
    
[/code]

**ソースコード**

[code]

    func editDictionaryData(data: [Int: CardItem]) {
        let sortedDic = data.sorted(by: <)
        self.cards = sortedDic.map { $0.value }
    }
    
[/code]

xcodeのバグかと思い、  
cmd + shift + k  
cmd + shift + option + k  
xcode再起動を試して見たのですが、効果はありませんでした。  
環境はxcode11.6, 11.5両方で試しました。

どなたか、ご教授お願いいたします。


CC BY-SA 4.0
2020-08-03T14:18:12.523
69218
2020-08-03T20:53:30.660
2020-08-03T15:47:53.933
3060
40865
question
swift xcode
辞書をkeyでソートしたい


コメントを書いた後で気付いたのですが、タイトルに「辞書をkeyでソート」と明記してあり、回答として書ける事柄があるのでお示ししておきます。

まず、Swiftの`Dictionary`型の`sorted(by:)`のクロージャーは、(今回の場合)`((key: Int, value:
CardItem), (key: Int, value: CardItem))`という引数を受け取れないといけません。引数が2つあり、両方とも`key`,
`value`を含むタプルになります。

`sorted(by: <)`と言う呼び出しが成功するためには、このタプル間の比較

[code]

    (key: Int, value: CardItem) < (key: Int, value: CardItem)
    
[/code]

が何らかの形で定義されていないといけません。

Swiftはタプルの要素の型によっては、そのようなタプル間の比較演算`<`を自動的に定義してくれるので、`sorted(by:
<)`は、そのような場合にだけ成功します。今回の場合はそのような条件が成立していないのだと考えられます。

(本来は、成功しなくても「そんな演算は定義されていない」と言う意味のエラーメッセージを出すべきところです。時間が取れるならAppleの[フィードバックアシスタント](https://developer.apple.com/bug-
reporting/)からバグ報告を送られると良いでしょう。)

* * *

ただし、このご質問では「辞書をkeyでソート」したいわけですから、そもそも、key-
value両方を含むタプル全体を比較するのは、本来やりたいこととは違うことをやっていることになります。(`key`の方が前にあるので、期待通りの結果にはなるでしょうが。)

「keyでソート」したいのであれば、明示的に`key`同士を比較するようにしてみてください。

[code]

            let sortedDic = data.sorted{ $0.key < $1.key }
    
[/code]

これで、少なくともコンパイラが Illegal instruction: 4 で止まってしまうことはなくなると思います。


CC BY-SA 4.0
2020-08-03T20:53:30.660
69221
2020-08-03T20:53:30.660
13972
69218
answer