web-dev-qa-db-ja.com

Swift-格納されている値の順序は辞書で完全に変更されています

辞書形式のデータを表示しようとしました。以下に、3つの試みがあります。最初の試行では、出力順序が完全に変更されました。 2回目の試行、出力順序は入力と同じです。しかし、3回目の試みで、変数をNSDictionaryとして宣言しました。受け取った正確な出力。辞書でこれが変わるのはなぜですか?親切に私を案内してください。 Swiftの辞書タグを検索しました。しかし、私は見つけることができませんでした。

//First Attempt
var dict : Dictionary = ["name1" : "Loy", "name2" : "Roy"]
        println(dict)

//output:
[name2: Roy, name1: Loy]

//Second Attempt
var dict : Dictionary = ["name2" : "Loy", "name1" : "Roy"]
        println(dict)

//output:
[name2: Loy, name1: Roy]
-----------------------------------------------------------

//Third Attempt With NSDictionary
var dict : NSDictionary = ["name1" : "Loy", "name2" : "Roy"]
            println(dict)

//output:
{
    name1 = Loy;
    name2 = Roy;
}

別の質問:プレイグラウンドを使用して確認しました。私のスクリーンショットは次のとおりです。

play_ground_screen_shot

ここで、NSDictionaryでは、最初にname5を指定しましたが、右側にname2が表示され、次にprintlnで昇順で表示されます。なぜこれが起こっているのですか?

play_ground_screen_shot_2

ここでは、Dictionaryで最初にname5を指定しましたが、右側にname2が表示され、次にprintlnで、Dictionary行での表示方法が表示されます。なぜこれが起こっているのですか?

19
McDonal_11

これは、辞書の定義によるものです。

辞書

ディクショナリは、同じタイプのキーと同じタイプの値の間の関連付けを、順序が定義されていないコレクションに格納します。

no順序があり、入れられたものとは異なる方法で出てくる可能性があります。
これはNSSetと同等です。


編集:

NSD辞書

辞書はキーと値のペアを収集します。 NSDictionaryは、単にオブジェクトの順序付きまたは順序なしのコレクションを維持するのではなく、指定されたキーに対してオブジェクトを保存し、検索に使用できます。

alsonoの順序がありますが、デバッグの目的で印刷時にソートされています。

13
Schemetrical

辞書を並べ替えることはできませんが、キーを並べ替えて次のようにループすることができます。

let myDictionary = ["name1" : "Loy", "name2" : "Roy", "name3" : "Tim", "name4" : "Steve"]   // ["name1": "Loy", "name2": "Roy", "name3": "Tim", "name4": "Steve"]


let sorted = myDictionary.sorted {$0.key < $1.key}  // or {$0.value < $1.value} to sort using the dictionary values
print(sorted) // "[(key: "name1", value: "Loy"), (key: "name2", value: "Roy"), (key: "name3", value: "Tim"), (key: "name4", value: "Steve")]\n"
for element in sorted {
    print("Key = \(element.key) Value = \(element.value)" )
}
10
Leo Dabus

NSDictionarySwift::Dictionaryもストレージを注文しません。違いは、一部のNSDictionaryオブジェクトは印刷時に出力をソートし、Swift::Dictionaryはソートしないことです。

-[NSDictionary description]のドキュメントから:

辞書内の各キーがNSStringオブジェクトである場合、エントリはキーの昇順でリストされます。それ以外の場合、エントリがリストされる順序は定義されていません。このプロパティは、データのシリアル化ではなく、デバッグ目的で読み取り可能な出力を生成することを目的としています。

1
Greg Parker

から Swiftプログラミング言語

ディクショナリは、同じタイプのキーと同じタイプの値の間の関連付けを、順序が定義されていないでコレクションに保存します。

基本的に、出力に表示されるアイテムの順序は任意であり、データ構造の内部実装に依存するため、依存しないでください。

0
Jakub Vano

これは確かに辞書の問題です。ただし、注文を初期化した方法のままにするために利用できるライブラリがあります。

OrderedDictionaryは、Swiftの順序付き辞書データ構造の軽量な実装です。

OrderedDictionary構造は、Swift標準ライブラリのDictionaryとArrayの機能を組み合わせた不変の汎用コレクションです。Dictionaryと同様に、キーと値のペアを格納し、各キーを値にマップします。ゼロベースの整数インデックスによってソートされアクセス可能なこれらのペアを保存します。

こちらをご覧ください: https://github.com/lukaskubanek/OrderedDictionary

0
Antoine

パーティーに少し遅れましたが、順序を維持したい場合は KeyValuePairs を使用します。ここでのトレードオフは、KeyValuePairsを使用すると、あなたのリスト

var user: KeyValuePairs<String, String> {
    return ["FirstName": "NSDumb",
            "Address": "some address value here",
            "Age":"30"]
}

プリント

["FirstName": "NSDumb", "Address": "some address value", "Age": "30"]
0
NSDumb