webentwicklung-frage-antwort-db.com.de

Swift - Reihenfolge der gespeicherten Werte wird im Wörterbuch vollständig geändert

Ich habe versucht, Daten im Wörterbuchformat anzuzeigen. Unten sind drei Versuche vorhanden. Beim ersten Versuch wird die Ausgabereihenfolge vollständig geändert. Beim zweiten Versuch entspricht die Ausgabereihenfolge der Eingabe. Aber im dritten Versuch habe ich die Variable als NSDictionary deklariert. Genaue Ausgabe habe ich erhalten. Warum ändert sich das im Wörterbuch? Bitte leite mich. Ich suchte nach Swift's Dictionary-Tag. Aber ich konnte es nicht herausfinden.

//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;
}

EINE ANDERE FRAGE: Ich habe Spielplatz zur Überprüfung verwendet. Mein Screenshot ist unten:

play_ground_screen_shot

Hier in NSDictionary habe ich zuerst name5 angegeben, aber auf der rechten Seite wird name2 angezeigt, dann in println in aufsteigender Reihenfolge. Warum passiert das?

play_ground_screen_shot_2

Hier in Dictionary habe ich zuerst name5 angegeben, aber auf der rechten Seite wird name2 angezeigt, und in println wird angezeigt, wie es in die Dictionary-Zeile übernommen wird. Warum passiert das?

16
McDonal_11

Dies liegt an der Definition von Wörterbüchern:

Wörterbuch

Ein Wörterbuch speichert Verknüpfungen zwischen Schlüsseln desselben Typs und Werten desselben Typs in einer Sammlung ohne definierte Reihenfolge.

Es gibt keine Reihenfolge, sie könnten anders herauskommen, als sie eingegeben wurden. 
Dies ist vergleichbar mit NSSet.


Bearbeiten:

NSDictionary

Wörterbücher Sammeln Sie Schlüsselwertpaare. Anstatt nur eine geordnete oder ungeordnete Sammlung von Objekten zu verwalten, speichert ein NSDictionary Objekte anhand bestimmter Schlüssel, die dann zum Abrufen verwendet werden können.

Es gibt auch no order, es wird jedoch zu Debugging-Zwecken sortiert gedruckt.

12
Schemetrical

Sie können ein Wörterbuch nicht sortieren, aber Sie können seine Schlüssel sortieren und wie folgt durchlaufen:

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)" )
}
9
Leo Dabus

Dies ist in der Tat ein Problem mit Wörterbüchern. Es steht jedoch eine Bibliothek zur Verfügung, um sicherzustellen, dass die Reihenfolge so bleibt, wie Sie sie initialisiert haben. 

OrderedDictionary ist eine einfache Implementierung einer geordneten Wörterbuchdatenstruktur in Swift.

Die OrderedDictionary-Struktur ist eine unveränderliche generische Sammlung, die die Funktionen von Dictionary und Array aus der Swift-Standardbibliothek kombiniert. Wie bei Dictionary werden Schlüssel-Wert-Paare gespeichert und jeder Schlüssel einem Wert zugeordnet. Wie bei Array werden diese Paare nach einem auf Null basierenden Integer-Index sortiert und abgerufen.

Überprüfen Sie es hier: https://github.com/lukaskubanek/OrderedDictionary

1
Antoine

Weder NSDictionary noch Swift::Dictionary ordnet seine Speicherung an. Der Unterschied ist, dass einige NSDictionary-Objekte beim Drucken ihre Ausgabe sortieren und Swift::Dictionary nicht.

Aus der Dokumentation von -[NSDictionary description]:

Wenn jeder Schlüssel im Wörterbuch ein NSString-Objekt ist, lauten die Einträge in aufsteigender Reihenfolge nach Schlüssel, sonst die Reihenfolge, in der die Einträge sind aufgelistet undefiniert. Diese Eigenschaft soll .__ erzeugen. lesbare Ausgabe für Debugging-Zwecke, nicht zur Serialisierung von Daten.

1
Greg Parker

Von Die Programmiersprache Swift :

Ein Wörterbuch speichert Verknüpfungen zwischen Schlüsseln desselben Typs und Werten desselben Typs in einer Sammlung mit keine definierte Reihenfolge.

Grundsätzlich ist die Reihenfolge der Elemente in der Ausgabe beliebig, abhängig von der internen Implementierung der Datenstruktur und sollte nicht als verlässlich angesehen werden.

0
Jakub Vano

Ein bisschen zu spät für die Party, aber wenn Sie die Reihenfolge beibehalten möchten, dann verwenden Sie KeyValuePairs . Der Nachteil hierbei ist, dass Sie bei Verwendung von KeyValuePairs die Fähigkeit verlieren, eindeutige Elemente in zu verwalten deine Liste

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

druckt

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