2016-07-16 16 views
6

Versuchen, ein NSMutableDictionary in Swift 3 zu sortieren, Code aus Swift 2 funktioniert nicht mehr für mich (verschiedene Fehler).Sortierung Wörterbuch in Swift 3

Ich versuche, den folgenden Code zu verwenden, um meine Wörterbuch durch ihre Werte zu sortieren, die Schwimmer sind:

var sortedDict = unsortedDict.allValues.sorted({ $0 < $1 }).flatMap({ floatedlotterydictionary[$0] }) 

Im Wesentlichen Ich möchte diese unsortiert Wörterbuch ...

{ 
a = "1.7"; 
b = "0.08"; 
c = "1.4"; 
} 

.. .to in dieses sortierte Wörterbuch ...

{ 
b = "0.08"; 
c = "1.4"; 
a = "1.7"; 
} 

Aber die Verwendung dieser Codezeile von oben gibt die zurück Fehler "Argumenttyp AnyObject entspricht nicht dem Typ NSCopying" für den $0 < $1 Teil. Wie kann ich ein Wörterbuch anhand seiner Werte in Swift 3 sortieren?

(Hinweis: Diese Zeile Code kam teilweise aus this answer.)

I Swift 3 in Xcode 8 Beta 1 verwenden.

+0

Ein Wörterbuch ist per definitionem ungeordnet. Es ist unmöglich, das gewünschte Ergebnis als Wörterbuch zu erhalten. Und benutze 'NSMutableDictionary' nicht in Swift. Es ist überhaupt nicht verwandt mit dem Swift 'Dictionary'. – vadian

+0

Und ja, ich verstehe, ein Wörterbuch ist ungeordnet ... aber ich will es bestellt;). Und obwohl es nicht verwandt ist, was ist daran falsch? – owlswipe

Antwort

7

Ok. Die für ein normales Wörterbuch verfügbaren Erfassungsmethoden sind zwar weiterhin verfügbar, der Typ der Objekte wird jedoch nicht erzwungen, wodurch eine vererbte Eigenschaft hinzugefügt wird.

In der docs nimmt die sorted eine Schließung, die uns Zugriff auf den Schlüssel und den Wert zur gleichen Zeit ermöglicht und es als ein Element betrachten und damit Ihr Wörterbuch sortieren.

let k: NSMutableDictionary = ["a" : 1.7, "b" : 0.08, "c" : 1.4] 
print(k.sorted(isOrderedBefore: { (a, b) in (a.value as! Double) < (b.value as! Double) })) 

Das Gussteil ist erforderlich, da die Art der a.value und b.valueAnyObject ist. Dies funktioniert auf meinem Computer mit Xcode Version 8.0 Beta (8S128d).

+0

'NSMutableDictionary' tut ** nicht ** Brücke zu Swift' Dictionary' – vadian

+0

Ich bin jetzt bei einem Laptop - Danke. – Mrwerdo

+1

Das Ergebnis ist ein Array von Tupeln, kein Wörterbuch. – vadian

4

Es gibt auch so:

let k = ["a" : 1.7, "b" : 0.08, "c" : 1.4] 

print(k.flatMap({$0}).sort { $0.0.1 < $0.1.1 })