J'ai un contenant dictionnaire UIColor
objets hachurées par une valeur ENUM, ColorScheme
:
var colorsForColorScheme: [ColorScheme : UIColor] = ...
Je voudrais pouvoir extraire un tableau de toutes les couleurs (les valeurs) contenues dans ce dictionnaire. Je pensais pouvoir utiliser la values
propriété, telle qu'elle est utilisée lors de l'itération sur les valeurs du dictionnaire ( for value in dictionary.values {...}
), mais cela renvoie une erreur:
let colors: [UIColor] = colorsForColorSchemes.values
~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'
Il semble qu'au lieu de renvoyer une Array
valeur de valeurs, la values
méthode renvoie un type de collection plus abstrait. Existe-t-il un moyen d'obtenir un Array
contenant les valeurs du dictionnaire sans les extraire dans une for-in
boucle?
arrays
dictionary
swift
Stuart
la source
la source
colorsForColorSchemes.values
Réponses:
Depuis Swift 2.0,
Dictionary
lavalues
propriété de renvoie désormais aLazyMapCollection
au lieu de aLazyBidirectionalCollection
. LeArray
type sait comment s'initialiser à l'aide de ce type de collection abstraite:L'inférence de type de Swift sait déjà que ces valeurs sont des
UIColor
objets, donc aucune conversion de type n'est requise, ce qui est bien!la source
[0: "small", 1: "medium", 2: "large"]
, ne générera probablement PAS["small", "medium", "large"]
Vous pouvez mapper le dictionnaire à un tableau de valeurs:
Closure prend un tuple clé-valeur du dictionnaire et ne renvoie qu'une valeur. Ainsi, la fonction de carte produit un tableau de valeurs.
Version plus lisible du même code:
METTRE À JOUR
Depuis Xcode 9.0, les valeurs du dictionnaire sont accessibles à l'aide de
values
property, qui est conforme auCollection
protocole:En règle générale, vous le voulez simplement sous forme de tableau:
et c'est tout.
la source
Utilisation
colorsForColorScheme.map({$0.value})
la source
vous pouvez créer une extension sur
LazyMapCollection
colorsForColorSchemes.values.toArray()
oucolorsForColorSchemes.keys.toArray()
la source
Tout d'abord, d'après l'instruction suivante, il semble que le nom de votre variable (dictionnaire) soit
colorsForColorScheme
pendant que vous essayez d'obtenir les valeurs du
colorsForColorSchemes
dictionnaire lorsque vous l'avez fait-ce qui devrait vous donner une erreur de compilation. Quoi qu'il en soit, je suppose que vous avez eu une faute de frappe, et le nom de votre dictionnaire est
colorsForColorSchemes
. Alors, voici la solution-Comme mentionné précédemment, en raison de la propriété d'inférence de type dans swift, votre code peut déduire que le type renvoyé par le
.values
fonction renvoie un tableau d'UIColor. Cependant, Swift veut être de type sécurisé, donc lorsque vous stockez les valeurs dans lecolors
tableau, vous devez le définir explicitement. Pour swift 5 et au-dessus, vous pouvez maintenant simplement faire ce qui suit-la source
J'ai trouvé que c'était le plus utile dans Swift 5:
colorsForColorSchemes.allValues
Voir la documentation - https://developer.apple.com/documentation/foundation/nsdictionary/1408915-allvalues
la source
d.values
. En pratiqueArray(d.values)