Swift字典:以数组的形式获取值

我有一个字典,其中包含_由枚举值散列的ABC_0个对象,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'

values方法似乎不是返回值为0的_ABC_,而是返回更抽象的集合类型。有没有一种方法可以获得包含字典的值的Array,而无需在for-in循环中提取它们?

119250 次浏览

从SWIFT 2.0开始,Dictionaryvalues属性现在返回LazyMapCollection,而不是LazyBidirectionalCollectionArray类型知道如何使用该抽象集合类型来初始化自身:

let colors = Array(colorsForColorSchemes.values)

Swift的类型推断已经知道这些值是ABC_0对象的_,因此不需要类型转换,这很好!

您可以将字典映射到值数组:

let colors = colorsForColorScheme.map { $0.1 }

Closure从Dictionary中获取一个键值元组,并只返回一个值。因此,map函数产生一个值数组。

相同代码的更具可读性的版本:

let colors = colorsForColorScheme.map { (scheme, color) in
return color
}

更新

从Xcode 9.0开始,可以使用values属性来访问字典值,该属性符合Collection协议:

let colors = colorsForColorScheme.values

通常,您只需要将其作为一个数组:

let colors = Array(dict.values)

就这样了。

您可以在LazyMapCollection上创建扩展名

public extension LazyMapCollection  {


func toArray() -> [Element]{
return Array(self)
}
}

colorsForColorSchemes.values.toArray()colorsForColorSchemes.keys.toArray()

使用colorsForColorScheme.map({$0.value})

我发现这是Swift 5中最有用的:

colorsForColorSchemes.allValues

请参阅文档-https://developer.apple.com/documentation/foundation/nsdictionary/1408915-allvalues

首先,从下面的语句来看,您的变量(字典)名称似乎是colorsForColorScheme

var colorsForColorScheme: [ColorScheme : UIColor] = ...

当您尝试从colorsForColorSchemes字典中获取值时,如果您-

let colors: [UIColor] = colorsForColorSchemes.values

这应该会给你一个编译时错误。无论如何,我假设你有一个错别字,你的字典的名字是colorsForColorSchemes。所以,这是解决方案-

正如前面提到的,由于Swift中的类型推断属性,您的代码可以推断.values函数返回的类型是UICOLOR数组。但是,Swift希望是类型安全的,因此当您将值存储在colors数组中时,您需要显式地定义它。对于SWIFT 5及以上版本,现在您只需执行以下操作-

let colors = [UIColor](colorsForColorSchemes.values)

也可以使用flatMap

let colors = colorsForColorScheme.values.flatMap { $0 }