2014-11-18 39 views
85

Ho un dizionario contenente UIColor oggetti hash per un valore di enumerazione, ColorScheme:Swift Dizionario: ottenere i valori come array di

var colorsForColorScheme: [ColorScheme : UIColor] = ... 

Mi piacerebbe essere in grado di estrarre un array di tutti i colori (i valori) contenuto da questo dizionario. Ho pensato che avrei potuto utilizzare la proprietà values, come viene utilizzato quando l'iterazione di valori del dizionario (for value in dictionary.values {...}), ma questo restituisce un errore:

let colors: [UIColor] = colorsForColorSchemes.values 
         ~~~~~~~~~~~~~~~~~~~~~^~~~~~~ 
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor' 

Sembra che invece di restituire un Array di valori, il metodo values restituisce un tipo di raccolta più astratto. C'è un modo per ottenere uno Array contenente i valori del dizionario senza estrarli in un ciclo for-in?

risposta

191

A partire da Swift 2.0, la proprietà values di restituisce ora LazyMapCollection anziché LazyBidirectionalCollection. Il tipo Array sa come inizializzare se stesso utilizzando questo tipo di raccolta astratto: inferenza di tipo

let colors = Array(colorsForColorSchemes.values) 

di Swift sa già che questi valori sono UIColor oggetti, quindi non è necessario alcun tipo di fusione, che è bello!

+0

puoi anche lanciarlo come un array di oggetti tipizzati pure. funziona alla grande! grazie let colors = [CustomColorObject] (colorsForColorSchemes.values) – bolnad

+6

Sembra che in Swift 2.0, Dictionary.values ​​restituisca ora LazyMapCollection anziché LazyBidirectionalCollection. Sfortunatamente, .array non è definito su LazyMapCollection. Tuttavia, il modo Array (dictionary.values) funziona ancora bene, poiché i tipi di array sanno come inizializzarsi da LazyMapCollection. –

+4

Si noti che l'ordine dei valori potrebbe essere inaspettato. Ad esempio '[0:" small ", 1:" medium ", 2:" large "]' probabilmente * NON * genererà '[" small "," medium "," large "]' –

26

È possibile anche mappare dizionario per una matrice di valori:

let colors = colorsForColorScheme.map { $0.1 } 

Chiusura prende una tupla di valori-chiave da dizionario e restituisce solo un valore. Quindi, la funzione map produce una matrice di valori.

5

è possibile creare un interno LazyMapCollection

public extension LazyMapCollection { 

    func toArray() -> [Element]{ 
     return Array(self) 
    } 
} 

colorsForColorSchemes.values.toArray() o colorsForColorSchemes.keys.toArray()

1

Usa colorsForColorScheme.map({$0.value})

Problemi correlati