Swift辞書:値を配列として取得


150

UIColorenum値でハッシュされたオブジェクトを含む辞書があります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ますか?


1
スウィフト5: colorsForColorSchemes.values
フアンボエロ

回答:


284

Swift 2.0以降、DictionaryvaluesプロパティはのLazyMapCollection代わりにを返すようになりましたLazyBidirectionalCollectionArrayタイプは、この抽象コレクション型を使用して自分自身を初期化する方法を知っています:

let colors = Array(colorsForColorSchemes.values)

Swiftの型推論は、これらの値がUIColorオブジェクトであることをすでに認識しているため、型キャストは必要ありません。


1
型付きオブジェクトを含む配列としてキャストすることもできます。よく働く!おかげで色= [CustomColorObject](colorsForColorSchemes.values)
bolnad '27 / 07/27

6
Swift 2.0では、Dictionary.valuesはLazyBidirectionalCollectionではなくLazyMapCollectionを返すように見えます。残念ながら、.arrayはLazyMapCollectionで定義されていません。ただし、配列タイプはLazyMapCollectionからそれ自体を初期化する方法を知っているため、Array(dictionary.values)の方法は引き続き正常に機能します。
Tod Cunningham

8
値の順序は予期しない場合があることに注意してください。たとえば、[0: "small", 1: "medium", 2: "large"]おそらく生成されません["small", "medium", "large"]
Simon Bengtsson 2016

55

辞書を値の配列にマップできます。

let colors = colorsForColorScheme.map { $0.1 }

クロージャはディクショナリからキー値タプルを取得し、値のみを返します。したがって、map関数は値の配列を生成します。

同じコードのより読みやすいバージョン:

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

更新

Xcode 9.0以降、ディクショナリ値にはvaluesCollectionプロトコルに準拠するプロパティを使用してアクセスできます。

let colors = colorsForColorScheme.values

通常は、配列として必要なだけです。

let colors = Array(dict.values)

以上です。


2
しかし、実際には、これは配列を取得するための読みやすい方法です。color = Array(colorsForColorScheme.values)
Renetik

1
このソリューションが大好き
Navy Seal

@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必要があるため、配列に値を格納するときは、明示的に定義する必要があります。Swift 5以降では、次のようにすることができます-

let colors = [UIColor](colorsForColorSchemes.values)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.