web-dev-qa-db-ja.com

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

列挙値UIColorでハッシュされたColorSchemeオブジェクトを含む辞書があります:

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

この辞書に含まれるすべての色(値)の配列を抽出できるようにしたいと思います。辞書の値(for value in dictionary.values {...})を反復処理するときに使用されるように、valuesプロパティを使用できると考えましたが、これはエラーを返します。

let colors: [UIColor] = colorsForColorSchemes.values
                        ~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'

Arrayメソッドは、値のvaluesを返すのではなく、より抽象的なコレクション型を返すようです。 for-inループで値を抽出せずに、辞書の値を含むArrayを取得する方法はありますか?

131
Stuart

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

let colors = Array(colorsForColorSchemes.values)

Swiftの型推論は、これらの値がUIColorオブジェクトであることを既に知っているため、型キャストは不要です。

252
Stuart

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

let colors = colorsForColorScheme.map { $0.1 }

クロージャーは、辞書からキーと値のタプルを受け取り、値のみを返します。したがって、マップ関数は値の配列を生成します。

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

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

UPDATE

Xcode 9.0から、valuesプロトコルに準拠するCollectionプロパティを使用して、辞書の値にアクセスできます。

let colors = colorsForColorScheme.values
39
pjuzeliunas

LazyMapCollectionに拡張機能を作成できます

public extension LazyMapCollection  {

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

colorsForColorSchemes.values.toArray()またはcolorsForColorSchemes.keys.toArray()

8
GSerjo

colorsForColorScheme.map({$0.value})を使用します

7