web-dev-qa-db-fra.com

Swift Dictionary: Obtenir les valeurs sous forme de tableau

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?

135
Stuart

À partir de Swift 2.0, la propriété Dictionaryvalues 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!

258
Stuart

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
43
pjuzeliunas

Utiliser colorsForColorScheme.map({$0.value})

8
Vishal kundaliya

vous pouvez créer une extension sur LazyMapCollection

public extension LazyMapCollection  {

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

colorsForColorSchemes.values.toArray() ou colorsForColorSchemes.keys.toArray()

8
GSerjo