Swift Dictionary:将值作为数组获取

Stu*_*art 140 arrays dictionary swift

我有一个包含UIColor由枚举值散列的对象的字典,ColorScheme:

var colorsForColorScheme: [ColorScheme : UIColor] = ...
Run Code Online (Sandbox Code Playgroud)

我希望能够提取此字典包含的所有颜色(值)的数组.我认为我可以使用该values属性,就像在迭代字典值(for value in dictionary.values {...})时使用的那样,但这会返回错误:

let colors: [UIColor] = colorsForColorSchemes.values
                        ~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'
Run Code Online (Sandbox Code Playgroud)

似乎不是返回Array值,该values方法返回更抽象的集合类型.有没有办法获得Array包含字典的值而不在for-in循环中提取它们?

Stu*_*art 269

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

let colors = Array(colorsForColorSchemes.values)
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,值的顺序可能是意外的.例如`[0:"small",1:"medium",2:"large"]`可能*NOT*生成`["small","medium","large"]` (7认同)
  • 看起来在Swift 2.0中,Dictionary.values现在返回一个LazyMapCollection而不是一个LazyBidirectionalCollection.不幸的是,.array没有在LazyMapCollection上定义.但是,Array(dictionary.values)方式仍然可以正常工作,因为数组类型知道如何从LazyMapCollection初始化自身. (6认同)

pju*_*nas 45

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

let colors = colorsForColorScheme.map { $0.1 }
Run Code Online (Sandbox Code Playgroud)

Closure从字典中获取键值元组并仅返回一个值.因此,map函数会生成一个值数组.

  • 但实际上这是获取数组的可读方式 let colors = Array(colorsForColorScheme.values) (2认同)

小智 9

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


GSe*_*rjo 8

你可以创建一个扩展 LazyMapCollection

public extension LazyMapCollection  {

    func toArray() -> [Element]{
        return Array(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Nat*_*sha 5

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

var colorsForColorScheme: [ColorScheme : UIColor] = ... 
Run Code Online (Sandbox Code Playgroud)

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

let colors: [UIColor] = colorsForColorSchemes.values
Run Code Online (Sandbox Code Playgroud)

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

如前所述,由于 swift 中的类型推断属性,您的代码可以推断出.values函数返回的类型正在返回一个 UIColor 数组。但是,Swift 想要类型安全,因此当您将值存储在colors数组中时,您需要明确定义它。对于 swift 5 及更高版本,现在您可以执行以下操作-

let colors = [UIColor](colorsForColorSchemes.values)
Run Code Online (Sandbox Code Playgroud)