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