辞書形式のデータを表示しようとしました。以下に、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;
}
別の質問:プレイグラウンドを使用して確認しました。私のスクリーンショットは次のとおりです。
ここで、NSDictionaryでは、最初にname5を指定しましたが、右側にname2が表示され、次にprintlnで昇順で表示されます。なぜこれが起こっているのですか?
ここでは、Dictionaryで最初にname5を指定しましたが、右側にname2が表示され、次にprintlnで、Dictionary行での表示方法が表示されます。なぜこれが起こっているのですか?
これは、辞書の定義によるものです。
ディクショナリは、同じタイプのキーと同じタイプの値の間の関連付けを、順序が定義されていないコレクションに格納します。
no順序があり、入れられたものとは異なる方法で出てくる可能性があります。
これはNSSetと同等です。
編集:
辞書はキーと値のペアを収集します。 NSDictionaryは、単にオブジェクトの順序付きまたは順序なしのコレクションを維持するのではなく、指定されたキーに対してオブジェクトを保存し、検索に使用できます。
alsonoの順序がありますが、デバッグの目的で印刷時にソートされています。
辞書を並べ替えることはできませんが、キーを並べ替えて次のようにループすることができます。
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)" )
}
NSDictionary
もSwift::Dictionary
もストレージを注文しません。違いは、一部のNSDictionary
オブジェクトは印刷時に出力をソートし、Swift::Dictionary
はソートしないことです。
-[NSDictionary description]
のドキュメントから:
辞書内の各キーがNSStringオブジェクトである場合、エントリはキーの昇順でリストされます。それ以外の場合、エントリがリストされる順序は定義されていません。このプロパティは、データのシリアル化ではなく、デバッグ目的で読み取り可能な出力を生成することを目的としています。
から Swiftプログラミング言語 :
ディクショナリは、同じタイプのキーと同じタイプの値の間の関連付けを、順序が定義されていないでコレクションに保存します。
基本的に、出力に表示されるアイテムの順序は任意であり、データ構造の内部実装に依存するため、依存しないでください。
これは確かに辞書の問題です。ただし、注文を初期化した方法のままにするために利用できるライブラリがあります。
OrderedDictionaryは、Swiftの順序付き辞書データ構造の軽量な実装です。
OrderedDictionary構造は、Swift標準ライブラリのDictionaryとArrayの機能を組み合わせた不変の汎用コレクションです。Dictionaryと同様に、キーと値のペアを格納し、各キーを値にマップします。ゼロベースの整数インデックスによってソートされアクセス可能なこれらのペアを保存します。
こちらをご覧ください: https://github.com/lukaskubanek/OrderedDictionary
パーティーに少し遅れましたが、順序を維持したい場合は 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"]