web-dev-qa-db-ja.com

Swiftの順序付きマップ

Swift 2に順序付きマップを作成するbuilt-in方法はありますか?配列[T]はオブジェクトが追加される順序でソートされますが、辞書[K : V]は順序付けされません。

例えば

var myArray: [String] = []
myArray.append("val1")
myArray.append("val2")
myArray.append("val3")

//will always print "val1, val2, val3"
print(myArray)


var myDictionary: [String : String] = [:]
myDictionary["key1"] = "val1"
myDictionary["key2"] = "val2"
myDictionary["key3"] = "val3"

//Will print "[key1: val1, key3: val3, key2: val2]"
//instead of "[key1: val1, key2: val2, key3: val3]"
print(myDictionary)

配列と同じ方法で順序付けられた順序付きkey : valueマップを作成する組み込みの方法はありますか、それとも独自のクラスを作成する必要がありますか?

Swiftに含まれているものはすべてより効率的である可能性が高いため、可能な限り、独自のクラスの作成を避けたいと思います。

46
Jojodmo

タイプIntのキーを持つことで、それらを注文できます。

var myDictionary: [Int: [String: String]]?

または

var myDictionary: [Int: (String, String)]?

より一般的な形式(たとえば、JSON)であるため、最初のものをお勧めします。

29
chrisamanse

代わりにタプルの配列を使用してください。好きなもので並べ替えます。すべての「組み込み」。

var array = [(name: String, value: String)]()
// add elements
array.sort() { $0.name < $1.name }
// or
array.sort() { $0.0 < $1.0 }
32
Mundi

「キーと値のペアの順序付けられたコレクションが必要で、Dictionaryが提供する高速なキールックアップが不要な場合は、 DictionaryLiteral タイプを参照してください。」 - https://developer.Apple.com/reference/Swift/dictionary

22
coffeecoder

Mattが言うように、辞書(およびセット)はSwift(およびObjective-C)の順不同コレクションです。これは仕様によるものです。

必要に応じて、辞書のキーの配列を作成し、それを必要な順序に並べ替えてから、それを使用して辞書からアイテムを取得できます。

NSDictionaryには、配列内の辞書のすべてのキーを提供するallKeysメソッドがあります。 Swift辞書オブジェクトについても似たようなことを覚えているようですが、私にはわかりません。Swiftのニュアンスをまだ学んでいます。

編集:

Swift Dictionaries it someDictionary.keys

7
Duncan C

Swiftには、組み込みの順序付けられた辞書機能は含まれていません。私の知る限り、Swift 2も

次に、独自に作成します。次のチュートリアルをご覧ください。

3
enes

キーがComparableを確認した場合、次のようにソートされていない辞書からソートされた辞書を作成できます。

let sortedDictionary = unsortedDictionary.sorted() { $0.key > $1.key }
3
Deep Parekh

私はパーティーにl8であることを知っていますが、NSMutableOrderedSetを調べましたか?

https://developer.Apple.com/reference/foundation/nsorderedset

要素の順序が重要で、オブジェクトがセットに含まれているかどうかをテストするパフォーマンスが考慮事項である場合、配列の代わりに順序セットを使用できます。配列のメンバーシップのテストは、セットのメンバーシップのテストよりも遅くなります。

1
AkademiksQc
    var orderedDictionary = [(key:String, value:String)]()
1
Jay Zi

他の人が言ったように、このタイプの構造に対する組み込みのサポートはありません。ある時点で標準ライブラリに実装を追加することは可能ですが、比較的ほとんどのアプリケーションで最適なソリューションになることはまれなので、私はあなたの息を止めません。

1つの選択肢は、 OrderedDictionary プロジェクトです。 BidirectionalCollectionに準拠しているため、おそらく他のCollectionタイプで使用するのと同じAPIのほとんどを取得でき、(現在)合理的に適切に管理されているようです。

0
PeejWeej