Tengo un diccionario que contiene UIColor
objetos hash con un valor de enumeración ColorScheme
:
var colorsForColorScheme: [ColorScheme : UIColor] = ...
Me gustaría poder extraer una matriz de todos los colores (los valores) contenidos en este diccionario. Pensé que podría usar la values
propiedad, como se usa al iterar sobre los valores del diccionario ( for value in dictionary.values {...}
), pero esto devuelve un error:
let colors: [UIColor] = colorsForColorSchemes.values
~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'
Parece que, en lugar de devolver un Array
valor, el values
método devuelve un tipo de colección más abstracto. ¿Hay alguna manera de obtener un que Array
contenga los valores del diccionario sin extraerlos en un for-in
bucle?
arrays
dictionary
swift
Stuart
fuente
fuente
colorsForColorSchemes.values
Respuestas:
A partir de Swift 2.0,
Dictionary
lavalues
propiedad ahora devuelve un enLazyMapCollection
lugar de unLazyBidirectionalCollection
. ElArray
tipo sabe cómo inicializarse utilizando este tipo de colección abstracta:La inferencia de tipos de Swift ya sabe que estos valores son
UIColor
objetos, por lo que no se requiere conversión de tipos, ¡lo cual es bueno!fuente
[0: "small", 1: "medium", 2: "large"]
, probablemente NO generará["small", "medium", "large"]
Puede asignar el diccionario a una matriz de valores:
El cierre toma una tupla clave-valor del diccionario y devuelve solo un valor. Entonces, la función de mapa produce una matriz de valores.
Versión más legible del mismo código:
ACTUALIZAR
Desde Xcode 9.0, se puede acceder a los valores del diccionario utilizando la
values
propiedad, que se ajusta alCollection
protocolo:Por lo general, solo lo quieres como una matriz:
y eso es.
fuente
Utilizar
colorsForColorScheme.map({$0.value})
fuente
puedes crear una extensión en
LazyMapCollection
colorsForColorSchemes.values.toArray()
ocolorsForColorSchemes.keys.toArray()
fuente
En primer lugar, de la siguiente declaración, parece que el nombre de su variable (diccionario) es
colorsForColorScheme
mientras intentas obtener los valores del
colorsForColorSchemes
diccionario cuando lo hiciste-que debería darte un error de tiempo de compilación. De todos modos, supongo que tenías un error tipográfico y el nombre de tu diccionario es
colorsForColorSchemes
. Entonces, aquí está la solución.Como se mencionó anteriormente, debido a la propiedad de inferencia de tipo en swift, su código puede inferir que el tipo devuelto por la
.values
función está devolviendo una matriz de UIColor. Sin embargo, Swift quiere ser seguro para los tipos, por lo que cuando almacena los valores en lacolors
matriz, debe definirlo explícitamente. Para Swift 5 y superior, ahora podría hacer lo siguiente:fuente
He encontrado que esto es lo más útil en Swift 5:
colorsForColorSchemes.allValues
Ver documentos: https://developer.apple.com/documentation/foundation/nsdictionary/1408915-allvalues
fuente
d.values
. En la prácticaArray(d.values)