Eu tenho um dicionário que contém UIColor
objetos com hash por um valor de enumeração ColorScheme
:
var colorsForColorScheme: [ColorScheme : UIColor] = ...
Gostaria de poder extrair uma matriz de todas as cores (os valores) contidas neste dicionário. Eu pensei que poderia usar a values
propriedade, como é usada ao iterar sobre valores de dicionário ( for value in dictionary.values {...}
), mas isso retorna um erro:
let colors: [UIColor] = colorsForColorSchemes.values
~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'
Parece que, em vez de retornar um Array
dos valores, o values
método retorna um tipo de coleção mais abstrato. Existe uma maneira de obter um Array
contendo os valores do dicionário sem extraí-los em um for-in
loop?
arrays
dictionary
swift
Stuart
fonte
fonte
colorsForColorSchemes.values
Respostas:
A partir do Swift 2.0,
Dictionary
avalues
propriedade agora retorna a emLazyMapCollection
vez de aLazyBidirectionalCollection
. OArray
tipo sabe como se inicializar usando este tipo de coleção abstrata:A inferência de tipo de Swift já sabe que esses valores são
UIColor
objetos, portanto, nenhuma conversão de tipo é necessária, o que é bom!fonte
[0: "small", 1: "medium", 2: "large"]
, provavelmente não gerar["small", "medium", "large"]
Você pode mapear o dicionário para uma matriz de valores:
Closure pega uma tupla de valor-chave do dicionário e retorna apenas um valor. Portanto, a função map produz uma matriz de valores.
Versão mais legível do mesmo código:
ATUALIZAR
No Xcode 9.0, os valores do dicionário podem ser acessados usando a
values
propriedade, que está em conformidade com oCollection
protocolo:Normalmente você só quer isso como uma matriz:
e é isso.
fonte
Usar
colorsForColorScheme.map({$0.value})
fonte
você pode criar uma extensão em
LazyMapCollection
colorsForColorSchemes.values.toArray()
oucolorsForColorSchemes.keys.toArray()
fonte
Em primeiro lugar, a partir da seguinte declaração, parece que o nome da sua variável (dicionário) é
colorsForColorScheme
enquanto você tenta obter os valores do
colorsForColorSchemes
dicionário quando vocêo que deve gerar um erro de tempo de compilação. De qualquer forma, estou assumindo que você cometeu um erro de digitação e o nome do seu dicionário é
colorsForColorSchemes
. Então, aqui está a soluçãoComo mencionado anteriormente, devido à propriedade de inferência de tipo em swift, seu código pode inferir que o tipo retornado da
.values
função está retornando uma matriz de UIColor. No entanto, o Swift quer ser seguro quanto ao tipo, portanto, quando você armazena os valores nacolors
matriz, precisa defini-lo explicitamente. Para o Swift 5 e superior, agora você pode fazer o seguinte:fonte
Eu achei isso o mais útil no Swift 5:
colorsForColorSchemes.allValues
Consulte docs - https://developer.apple.com/documentation/foundation/nsdictionary/1408915-allvalues
fonte
d.values
. Na práticaArray(d.values)