列挙値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
を取得する方法はありますか?
Swift 2.0以降、Dictionary
のvalues
プロパティは、LazyMapCollection
ではなくLazyBidirectionalCollection
を返すようになりました。 Array
型は、この抽象コレクション型を使用して自身を初期化する方法を知っています。
let colors = Array(colorsForColorSchemes.values)
Swiftの型推論は、これらの値がUIColor
オブジェクトであることを既に知っているため、型キャストは不要です。
辞書を値の配列にマップできます。
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
LazyMapCollection
に拡張機能を作成できます
public extension LazyMapCollection {
func toArray() -> [Element]{
return Array(self)
}
}
colorsForColorSchemes.values.toArray()
またはcolorsForColorSchemes.keys.toArray()
colorsForColorScheme.map({$0.value})
を使用します