2014-11-18 26 views
85

gibi değerleri alın: Bütün renklerin bir dizi ayıklamak mümkün olmak istiyorum Swift Sözlük: Bir enum değeri tarafından karma <code>UIColor</code> nesneleri <code>ColorScheme</code> içeren bir sözlük var dizide

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

(değerler) bu sözlükte bulunan Ben kullanıldıkça sözlük değerleri ( for value in dictionary.values {...}) üzerinden yineleme zaman, values özelliğini kullanabilirsiniz, ama bu hata verir: bir değerler Array dönen yerine

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

O görünüyor values yöntem döndüren bir daha soyut koleksiyon tipi. for-in döngüsünde bunları ayıklamadan sözlük değerlerini içeren bir Array almanın bir yolu var mı?

cevap

191

Swift 2.0, Dictionary ürününün values özelliği şimdiyerine LazyMapCollection değerini döndürür.

let colors = Array(colorsForColorSchemes.values) 

Swift'in tür kesmesi zaten bu değerler UIColor nesneler olduğunu bilir, herhangi bir tür döküm, hangi güzel gereklidir: Array türü bu soyut toplama türünü kullanarak kendini tanımlama işlemi bilir!

+0

bir uzantı oluşturabilirsiniz. harika çalışıyor! teşekkürler let renkler = [CustomColorObject] (colorsForColorSchemes.values) – bolnad

+6

Swift 2.0 gibi görünüyor, Dictionary.values ​​şimdi bir LazyBidirectionalCollection aksine bir LazyMapCollection döndürür. Ne yazık ki, .array bir LazyMapCollection üzerinde tanımlanmamış. Ancak Dizi (dictionary.values) yolu, dizi türleri bir LazyMapCollection öğesinden nasıl başlatılacağını bildiği için hala iyi çalışır. –

+4

Değerlerin sırasının beklenmedik olabileceğini unutmayın. Örneğin, [0: "küçük", 1: "orta", 2: "büyük"] 'muhtemelen * NOT *" ["küçük", "orta", "büyük"] üretecek * –

26

Ayrıca değerler dizisi için sözlüğünü bağlanabilirler:

let colors = colorsForColorScheme.map { $0.1 } 

Kapatma sözlükten bir anahtar-değer tuple alır ve sadece bir değer döndürür. Dolayısıyla, harita işlevi bir dizi değer üretir.

5

Eğer aynı zamanda Yazılan nesnelerle bir dizi olarak yayınlayabilmek için LazyMapCollection

public extension LazyMapCollection { 

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

colorsForColorSchemes.values.toArray() veya colorsForColorSchemes.keys.toArray()

1

Kullanım colorsForColorScheme.map({$0.value})