Tengo un diccionario que contiene UIColorobjetos 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 valuespropiedad, 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 Arrayvalor, el valuesmétodo devuelve un tipo de colección más abstracto. ¿Hay alguna manera de obtener un que Arraycontenga los valores del diccionario sin extraerlos en un for-inbucle?
arrays
dictionary
swift
Stuart
fuente
fuente

colorsForColorSchemes.valuesRespuestas:
A partir de Swift 2.0,
Dictionarylavaluespropiedad ahora devuelve un enLazyMapCollectionlugar de unLazyBidirectionalCollection. ElArraytipo sabe cómo inicializarse utilizando este tipo de colección abstracta:La inferencia de tipos de Swift ya sabe que estos valores son
UIColorobjetos, 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
valuespropiedad, que se ajusta alCollectionprotocolo: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
LazyMapCollectioncolorsForColorSchemes.values.toArray()ocolorsForColorSchemes.keys.toArray()fuente
En primer lugar, de la siguiente declaración, parece que el nombre de su variable (diccionario) es
colorsForColorSchememientras intentas obtener los valores del
colorsForColorSchemesdiccionario 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
.valuesfunción está devolviendo una matriz de UIColor. Sin embargo, Swift quiere ser seguro para los tipos, por lo que cuando almacena los valores en lacolorsmatriz, 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.allValuesVer documentos: https://developer.apple.com/documentation/foundation/nsdictionary/1408915-allvalues
fuente
d.values. En la prácticaArray(d.values)