Swift Dictionary:将值作为数组获取

时间:2014-11-18 06:41:47

标签: arrays dictionary swift

我有一个字典,其中包含按枚举值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循环中提取它们?

7 个答案:

答案 0 :(得分:251)

从Swift 2.0开始,Dictionary的{​​{1}}属性现在返回values而不是LazyMapCollectionLazyBidirectionalCollection类型知道如何使用此抽象集合类型初始化自身:

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 }