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


150

我有一本字典,其中包含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'

似乎Arrayvalues方法返回了一个更抽象的集合类型,而不是返回值的an 。有没有一种方法可以获取Array包含字典值的而不for-in循环提取它们的值?


1
斯威夫特5: colorsForColorSchemes.values
Juan Boero

Answers:


284

从Swift 2.0开始,Dictionaryvalues属性现在返回LazyMapCollection而不是LazyBidirectionalCollection。该Array类型知道如何使用此抽象集合类型进行初始化:

let colors = Array(colorsForColorSchemes.values)

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


1
您也可以将其转换为具有类型化对象的数组。很棒!谢谢让颜色= [CustomColorObject](colorsForColorSchemes.values)
bolnad

6
在Swift 2.0中,Dictionary.values现在返回LazyMapCollection而不是LazyBidirectionalCollection。不幸的是,.array没有在LazyMapCollection上定义。但是,由于数组类型知道如何从LazyMapCollection初始化自身,所以Array(dictionary.values)的方法仍然可以正常工作。
Tod Cunningham 2015年

8
请注意,值的顺序可能是意外的。例如,[0: "small", 1: "medium", 2: "large"]可能不会生成["small", "medium", "large"]
Simon Bengtsson

55

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

let colors = colorsForColorScheme.map { $0.1 }

闭包从字典中获取键值元组,并仅返回一个值。因此,映射函数会生成一个值数组。

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

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

更新

在Xcode 9.0中,可以使用values符合Collection协议的属性访问字典值:

let colors = colorsForColorScheme.values

通常,您只希望将其作为数组:

let colors = Array(dict.values)

就是这样。


2
但是实际上,这是一种获取数组的可读方法,让color = Array(colorsForColorScheme.values)
Renetik

1
喜欢这个解决方案
海军印章

@pjuzeliunas,因为这是最好的答案,我刚刚在2020年作了最新的编辑。显然要放松,编辑等!干杯,谢谢!
Fattie


8

您可以在 LazyMapCollection

public extension LazyMapCollection  {

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

colorsForColorSchemes.values.toArray() 要么 colorsForColorSchemes.keys.toArray()


3

首先,根据以下语句,您的变量(字典)名称似乎是 colorsForColorScheme

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

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

let colors: [UIColor] = colorsForColorSchemes.values

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

如前所述,由于swift中的类型推断属性,您的代码可以推断.values函数返回的类型正在返回UIColor数组。但是,Swift希望是类型安全的,因此在将值存储在colors数组中时,需要显式定义它。对于5或更高的速度,现在您可以执行以下操作-

let colors = [UIColor](colorsForColorSchemes.values)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.