J'ai un dictionnaire contenant des objets UIColor
hachés par une valeur enum, ColorScheme
:
var colorsForColorScheme: [ColorScheme : UIColor] = ...
J'aimerais pouvoir extraire un tableau de toutes les couleurs (les valeurs) contenues dans ce dictionnaire. Je pensais pouvoir utiliser la propriété values
, telle qu'elle est utilisée pour parcourir les valeurs du dictionnaire (for value in dictionary.values {...}
), mais une erreur est renvoyée:
let colors: [UIColor] = colorsForColorSchemes.values
~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'
Il semble que plutôt que de renvoyer une Array
de valeurs, la méthode values
renvoie un type de collection plus abstrait. Est-il possible d’obtenir une Array
contenant les valeurs du dictionnaire sans les extraire dans une boucle for-in
?
À partir de Swift 2.0, la propriété Dictionary
values
renvoie désormais un LazyMapCollection
au lieu d'un LazyBidirectionalCollection
. Le type Array
sait comment s'initialiser avec ce type de collection abstraite:
let colors = Array(colorsForColorSchemes.values)
L'inférence de type de Swift sait déjà que ces valeurs sont des objets UIColor
, aussi aucune conversion de type n'est requise, ce qui est agréable!
Vous pouvez mapper dictionnaire sur un tableau de valeurs:
let colors = colorsForColorScheme.map { $0.1 }
La fermeture prend un tuple clé-valeur du dictionnaire et renvoie juste une valeur. Ainsi, la fonction map produit un tableau de valeurs.
Version plus lisible du même code:
let colors = colorsForColorScheme.map { (scheme, color) in
return color
}
UPDATE
Depuis Xcode 9.0, il est possible d’accéder aux valeurs du dictionnaire à l’aide de la propriété values
, conforme au protocole Collection
:
let colors = colorsForColorScheme.values
Utiliser colorsForColorScheme.map({$0.value})
vous pouvez créer une extension sur LazyMapCollection
public extension LazyMapCollection {
func toArray() -> [Element]{
return Array(self)
}
}
colorsForColorSchemes.values.toArray()
ou colorsForColorSchemes.keys.toArray()