2016-12-05 9 views
3
var arr:Array<Dictionary<String, String>> = [["title":"Mrs","name":"Abc"],["title":"Mr","name":"XYZ"]] 
arr.sort { (<#[String : String]#>, <#[String : String]#>) -> Bool in 
     <#code#> 
    } 

Ich habe eine Reihe von Wörterbüchern mit dem Datenformat wie oben dargestellt. Ich möchte dieses Array nach Name Schlüssel sortieren. Ich habe es in älteren swift wie:Sortieren in swift 3.0

arr.sort{$0.name < $1.name} 

, die nicht mehr funktioniert. Bitte lassen Sie mich wissen, wie Sie mit dieser Struktur fortfahren und sie sortieren können.

Danke.

+4

Bin ich der einzige, der über denkt „@MartinR kommt !!“? :) –

+2

Punktnotation funktioniert nicht in * älteren swift * entweder. – vadian

+0

Ich stimme zu, kann nicht sehen, wann es funktionieren kann. Ich würde verwenden, wenn man den Namen Wert zu fangen, aber wenn Sie etwas kurz 'arr.sorted {$ 0 ["Name"] wollen! <$ 1 ["Name"]! } ' – Dam

Antwort

5

Sie haben eine Reihe von Wörterbüchern der Form [String: String] und ein Wörterbuch hat keine name Eigenschaft, so $0.name ungültig ist (in jede Swift-Version).

Das Abrufen des Wörterbuchwerts erfolgt über Subskribierung, z. B. , z. $0["name"], die eine optional zurückgibt. In Swift 2 können Sie Optionen direkt vergleichen (und nil wurde als "weniger" als alle nicht-nil Wert). Daher in Swift 2 könnten Sie das Array sortieren mit

arr.sortInPlace { $0["name"] < $1["name"] } 

jedoch die optionalen Vergleichsoperatoren haben in Swift 3 mit der Umsetzung von SE-0121 – Remove Optional Comparison Operators entfernt.

Daher müssen Sie $0["name"] auspacken. Wenn Sie 100% sicher sind, dass jedes Wörterbuch in dem Array einen „Namen“ können Sie Schlüssel dann auspacken gewaltsam als Ahmad F suggested

arr.sort { $0["name"]! < $1["name"]! } 

hat Wenn das nicht dann einen Standardnamen liefern garantiert wird, beispielsweise die leere Zeichenkette über den Null-Koaleszenz-Operator ??:

arr.sort { ($0["name"] ?? "") < ($1["name"] ?? "") } 

Beispiel:

var arr = [["title":"Mrs","name":"Abc"], ["title":"Mr","name":"XYZ"], ["title": "Dr"]] 
arr.sort { ($0["name"] ?? "") < ($1["name"] ?? "") } 
print(arr) 
// [["title": "Dr"], ["name": "Abc", "title": "Mrs"], ["name": "XYZ", "title": "Mr"]] 

Als einer, das Wörterbuch ohne "namen" Schlüssel sieht zuerst bestellt. Eine einfache Möglichkeit, Einträge zu sortieren, ohne Namen letzte wäre:

arr.sort { ($0["name"] ?? "\u{10FFFF}") < ($1["name"] ?? "\u{10FFFF}") } 
+0

Vielen Dank für die Klarstellung. Wenn der Schlüssel nicht garantiert "name" ist, gibt es eine Möglichkeit, ["title": "Dr"] (oder alle Wörterbücher ohne "name" -Schlüssel) endlich zu bestellen? –

+1

@AhmadF. Siehe Aktualisierung. –

+1

@dfri: Ist das der Fall? Die Sorte ist nicht stabil. –

4

Eigentlich bin ich nicht ganz sicher, ob arr.sort{$0.name < $1.name} in "älteren swift" gearbeitet, jedoch sollte es sein wie:

var arr:Array<Dictionary<String, String>> = [["title":"Mr","name":"XYZ"], ["title":"Mrs","name":"Abc"]] 

print(arr) // [["name": "XYZ", "title": "Mr"], ["name": "Abc", "title": "Mrs"]] 

arr.sort { 
    ($0["name"])! < ($1["name"])! 
} 

print(arr) // [["name": "Abc", "title": "Mrs"], ["name": "XYZ", "title": "Mr"]] 

Hoffe, es half.

+1

Angenommen, dass jedes Wörterbuch das' name' Feld hat ... –

+0

Dies war in älteren swift. Funktioniert nicht in swift 3. Bitte sehen Sie sich die erwartete Syntax an. –

+0

@MadhupSinghYadav Ich implementierte dies auf Spielplatz, Xcode 8.1 ... –