我有一个字典,其中包含按枚举值UIColor
散列的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
循环中提取它们?
答案 0 :(得分:251)
从Swift 2.0开始,Dictionary
的{{1}}属性现在返回values
而不是LazyMapCollection
。 LazyBidirectionalCollection
类型知道如何使用此抽象集合类型初始化自身:
Array
Swift的类型推断已经知道这些值是let colors = Array(colorsForColorSchemes.values)
个对象,所以不需要类型转换,这很好!
答案 1 :(得分:37)
您可以将字典映射到值数组:
let colors = colorsForColorScheme.map { $0.1 }
Closure从字典中获取键值元组并仅返回一个值。因此,map函数会生成一个值数组。
相同代码的更易读版本:
let colors = colorsForColorScheme.map { (scheme, color) in
return color
}
<强>更新强>
从Xcode 9.0开始,可以使用values
属性访问字典值,该属性符合Collection
协议:
let colors = colorsForColorScheme.values
答案 2 :(得分:8)
您可以在LazyMapCollection
public extension LazyMapCollection {
func toArray() -> [Element]{
return Array(self)
}
}
colorsForColorSchemes.values.toArray()
或colorsForColorSchemes.keys.toArray()
答案 3 :(得分:6)
使用colorsForColorScheme.map({$0.value})
答案 4 :(得分:3)
首先,从下面的语句来看,您的变量(字典)名称似乎是colorsForColorScheme
var colorsForColorScheme: [ColorScheme : UIColor] = ...
当您尝试从colorsForColorSchemes
字典中获取值时,
let colors: [UIColor] = colorsForColorSchemes.values
应该会给您一个编译时错误。无论如何,我都假设您输入错误,并且字典的名称为colorsForColorSchemes
。所以,这是解决方案-
如前所述,由于swift中的类型推断属性,您的代码可以推断出.values
函数返回的类型正在返回UIColor数组。但是,Swift希望是类型安全的,因此,当您将值存储在colors
数组中时,需要显式定义它。对于5以上的速度,现在您可以执行以下操作-
let colors = [UIColor](colorsForColorSchemes.values)
答案 5 :(得分:0)
我发现这在Swift 5中最有用:
colorsForColorSchemes.allValues
查看文档-https://developer.apple.com/documentation/foundation/nsdictionary/1408915-allvalues
答案 6 :(得分:0)
您也可以使用flatMap
:
let colors = colorsForColorScheme.values.flatMap { $0 }