Mam słownik zawierający UIColor
obiekty zhaszowane przez wartość wyliczenia ColorScheme
:
var colorsForColorScheme: [ColorScheme : UIColor] = ...
Chciałbym móc wyodrębnić tablicę wszystkich kolorów (wartości) zawartych w tym słowniku. Pomyślałem, że mogę użyć tej values
właściwości, która jest używana podczas iteracji po wartościach słownikowych ( for value in dictionary.values {...}
), ale zwraca to błąd:
let colors: [UIColor] = colorsForColorSchemes.values
~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'
Wydaje się, że zamiast zwracać Array
wartości, values
metoda zwraca bardziej abstrakcyjny typ kolekcji. Czy istnieje sposób na uzyskanie wartości Array
ze słownika bez wyodrębniania ich w for-in
pętli?
arrays
dictionary
swift
Stuart
źródło
źródło
colorsForColorSchemes.values
Odpowiedzi:
Jak Swift 2.0
Dictionary
„svalues
właściwość teraz zwracaLazyMapCollection
zamiastLazyBidirectionalCollection
.Array
Typ umie zainicjować się przy użyciu tego rodzaju abstrakcyjne kolekcji:Wnioskowanie o typie Swifta już wie, że te wartości są
UIColor
obiektami, więc nie jest wymagane rzutowanie typów, co jest miłe!źródło
[0: "small", 1: "medium", 2: "large"]
prawdopodobnie NIE wygeneruje["small", "medium", "large"]
Możesz odwzorować słownik na tablicę wartości:
Closure pobiera krotkę klucz-wartość ze słownika i zwraca tylko wartość. Zatem funkcja map generuje tablicę wartości.
Bardziej czytelna wersja tego samego kodu:
AKTUALIZACJA
Od Xcode 9.0 można uzyskać dostęp do wartości słownika za pomocą
values
właściwości, która jest zgodna zCollection
protokołem:Zwykle chcesz go po prostu jako tablicę:
i to wszystko.
źródło
Posługiwać się
colorsForColorScheme.map({$0.value})
źródło
możesz utworzyć rozszerzenie na
LazyMapCollection
colorsForColorSchemes.values.toArray()
lubcolorsForColorSchemes.keys.toArray()
źródło
Po pierwsze, z poniższego stwierdzenia wynika, że nazwa zmiennej (słownika) to
colorsForColorScheme
podczas próby pobrania wartości ze
colorsForColorSchemes
słownika, kiedy to zrobiłeś-co powinno spowodować błąd czasu kompilacji. W każdym razie zakładam, że miałeś literówkę, a nazwa słownika to
colorsForColorSchemes
. Oto rozwiązanie-Jak wspomniano wcześniej, ze względu na właściwość wnioskowania o typie w swift, kod może wywnioskować, że typ zwracany przez
.values
funkcję zwraca tablicę UIColor. Jednak Swift chce być bezpieczny dla typów, więc kiedy przechowujesz wartości wcolors
tablicy, musisz to jawnie zdefiniować. W przypadku Swift 5 i nowszych możesz po prostu wykonać następujące czynności:źródło
Zauważyłem, że jest to najbardziej przydatne w Swift 5:
colorsForColorSchemes.allValues
Zobacz dokumentację - https://developer.apple.com/documentation/foundation/nsdictionary/1408915-allvalues
źródło
d.values
. W praktyceArray(d.values)