Swift Dictionary: получение значений в виде массива

У меня есть словарь, содержащий UIColor объекты, хэшированные значением enum, ColorScheme:

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

Я хотел бы иметь возможность извлечь массив из всех цветов (значений), содержащихся в этом словаре. Я думал, что могу использовать свойство values, которое используется при итерации по значениям словаря (for value in dictionary.values {...}), но это возвращает ошибку:

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

Кажется, что вместо возвращаемого значения Array метод values возвращает более абстрактный тип коллекции. Есть ли способ получить Array, содержащий значения словаря, без выделения их в цикле for-in?

Ответ 1

С Swift 2.0 свойство Dictionary s values теперь возвращает LazyMapCollection вместо LazyBidirectionalCollection. Тип Array знает, как инициализировать себя, используя этот тип абстрактной коллекции:

let colors = Array(colorsForColorSchemes.values)

Вывод типа Swift уже знает, что эти значения являются объектами UIColor, поэтому не требуется кастинг типов, что приятно!

Ответ 2

Вы также можете сопоставить словарь с массивом значений:

let colors = colorsForColorScheme.map { $0.1 }

Closure берет ключ-значение из словаря и возвращает только значение. Таким образом, функция map создает массив значений.

Ответ 3

вы можете создать расширение на LazyMapCollection

public extension LazyMapCollection  {

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

colorsForColorSchemes.values.toArray() или colorsForColorSchemes.keys.toArray()

Ответ 4

Используйте colorsForColorScheme.map({$0.value})