2014-11-18 12 views
85

mam słownika zawierającego UIColor przedmiotów przerywanych przez ENUM, ColorScheme:Swift Dictionary uzyskać wartości w tablicy

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

ja jak w stanie wyekstrahować szereg wszystkich kolorów (wartości) zawarte w tym słowniku. Myślałem, że mogę użyć właściwości values, jaka jest używana podczas iteracji nad wartości słowniku (for value in dictionary.values {...}), ale zwraca błąd:

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

Wydaje się, że zamiast zwrócenie Array wartości, metoda values zwraca bardziej abstrakcyjny typ kolekcji. Czy istnieje sposób na uzyskanie wartości Array zawierającej wartości słownika bez wyodrębniania ich w pętli for-in?

Odpowiedz

191

Jeśli chodzi o Swift 2.0, Dictionary własność values zwraca teraz LazyMapCollection zamiast LazyBidirectionalCollection. Typ Array umie zainicjować się przy użyciu tego rodzaju abstrakcyjne Kolekcja:

let colors = Array(colorsForColorSchemes.values) 

Swift rodzaj wnioskowania już wie, że wartości te są UIColor obiekty, więc nie jest wymagany Typ odlewania, co jest bardzo miłe!

+0

można również rzucać go jako tablicę z wpisane przedmiotów, jak również. działa świetnie! thanks let colors = [CustomColorObject] (colorsForColorSchemes.values) – bolnad

+6

Wygląda na to, że w Swift 2.0, Dictionary.values ​​zwraca teraz LazyMapCollection w przeciwieństwie do LazyBidirectionalCollection. Niestety, .array nie jest zdefiniowany w LazyMapCollection. Jednak metoda Array (dictionary.values) nadal działa dobrze, ponieważ typy tablic wiedzą, jak zainicjować się z LazyMapCollection. –

+4

Należy pamiętać, że kolejność wartości może być nieoczekiwana. Na przykład '[0:" mały ", 1:" średni ", 2:" duży "]' prawdopodobnie * NIE * wygeneruje '[" mały "," średni "," duży "]' –

26

Można również mapować słownika do tablicy wartości:

let colors = colorsForColorScheme.map { $0.1 } 

Zamknięcie bierze klucz-wartość krotki ze słownika i zwraca tylko wartość. Funkcja map tworzy tablicę wartości.

5

można utworzyć rozszerzenie na LazyMapCollection

public extension LazyMapCollection { 

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

colorsForColorSchemes.values.toArray() lub colorsForColorSchemes.keys.toArray()

1

użytkowania colorsForColorScheme.map({$0.value})

Powiązane problemy