2016-07-16 120 views
6

Cercando di ordinare NSMutableDictionary in Swift 3, il codice di Swift 2 non funziona più per me (vari errori).Ordinamento dizionario in Swift 3

Sto cercando di utilizzare il seguente codice per ordinare il mio dizionario con i suoi valori, che sono galleggianti:

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

In sostanza, voglio questo dizionario non differenziati ...

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

.. per trasformarsi in questo dizionario ordinato ...

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

Ma usare quella riga di codice dall'alto restituisce il errore "argomento tipo anyobject non è conforme al tipo NSCopying" per la parte $0 < $1. Quindi, come posso ordinare un dizionario in base ai suoi valori in Swift 3?

(Nota: questa riga di codice è venuto in parte dal this answer.)

Sto usando Swift 3 in Xcode 8 beta 1.

+0

Un dizionario è non ordinato per definizione. È impossibile ottenere il risultato richiesto come dizionario. E non usare "NSMutableDictionary" in Swift. Non è affatto correlato al "dizionario" di Swift. – vadian

+0

E sì, ho capito che un dizionario non è ordinato ... ma lo voglio ordinato;). E anche se è in qualche modo non correlato, cosa c'è di sbagliato in questo? – owlswipe

risposta

7

Ok. I metodi di raccolta disponibili su un dizionario normale sono ancora disponibili, tuttavia il tipo di oggetti non viene applicato, il che aggiunge un'eredità non sicura.

Nel docs il sorted prende una chiusura che ci consente di accedere alla chiave e al valore allo stesso tempo e considerarlo come un elemento e quindi ordinare il dizionario.

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) })) 

La colata è richiesto, come il tipo di a.value e b.value è AnyObject. Funziona sul mio computer, eseguendo Xcode versione 8.0 beta (8S128d).

+0

'NSMutableDictionary' fa ** non ** bridge to Swift' Dictionary' – vadian

+0

Ora sono a un laptop - Grazie. – Mrwerdo

+1

Il risultato è una serie di tuple, non un dizionario. – vadian

4

C'è anche in questo modo:

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

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