У меня есть словарь, содержащий UIColor
объекты, хэшированные по значению enum ColorScheme
:
var colorsForColorScheme: [ColorScheme : UIColor] = ...
Я хотел бы иметь возможность извлечь массив всех цветов (значений), содержащихся в этом словаре. Я думал, что мог бы использовать values
свойство, которое используется при переборе значений словаря ( for value in dictionary.values {...}
), но это возвращает ошибку:
let colors: [UIColor] = colorsForColorSchemes.values
~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'
Похоже, что вместо возврата Array
значений, values
метод возвращает более абстрактный тип коллекции. Есть ли способ получить Array
содержащиеся в словаре значения без извлечения их в for-in
цикле?
arrays
dictionary
swift
Стюарт
источник
источник
colorsForColorSchemes.values
Ответы:
Как Свифт 2.0
Dictionary
«svalues
свойство теперь возвращаетLazyMapCollection
вместоLazyBidirectionalCollection
.Array
Тип знает , как инициализировать себя , используя этот абстрактный тип коллекции:Вывод типа Swift уже знает, что эти значения являются
UIColor
объектами, поэтому приведение типов не требуется, и это хорошо!источник
[0: "small", 1: "medium", 2: "large"]
, вероятно, не будет генерировать["small", "medium", "large"]
Вы можете сопоставить словарь с массивом значений:
Закрытие берет кортеж ключ-значение из словаря и возвращает только значение. Итак, функция map выдает массив значений.
Более читаемая версия того же кода:
ОБНОВИТЬ
Начиная с Xcode 9.0, к значениям словаря можно получить доступ, используя
values
свойство, соответствующееCollection
протоколу:Как правило, вы просто хотите его в виде массива:
и это все.
источник
использование
colorsForColorScheme.map({$0.value})
источник
Вы можете создать расширение на
LazyMapCollection
colorsForColorSchemes.values.toArray()
илиcolorsForColorSchemes.keys.toArray()
источник
Во-первых, из следующего утверждения кажется, что имя вашей переменной (словаря)
colorsForColorScheme
пока вы пытаетесь получить значения из
colorsForColorSchemes
словаря, когда вычто должно дать вам ошибку времени компиляции. В любом случае, я предполагаю, что у вас была опечатка, и ваш словарь зовут
colorsForColorSchemes
. Итак, вот решениеКак упоминалось ранее, из-за свойства вывода типа в swift ваш код может сделать вывод, что возвращаемый тип из
.values
функции возвращает массив UIColor. Однако Swift хочет быть безопасным с точки зрения типов, поэтому, когда вы сохраняете значения вcolors
массиве, вам необходимо явно определить это. Для быстрой 5 и выше, теперь вы можете просто сделать следующее-источник
Я нашел это наиболее полезным в Swift 5:
colorsForColorSchemes.allValues
См. Документы - https://developer.apple.com/documentation/foundation/nsdictionary/1408915-allvalues
источник
d.values
. На практикеArray(d.values)