Hızlı Sözlük: Değerleri dizi olarak alma


151

UIColorBir numaralandırma değeri tarafından karma nesneleri içeren bir sözlük var ColorScheme:

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

Bu sözlükte bulunan tüm renkleri (değerleri) bir dizi ayıklamak istiyorum. valuesSözlük değerleri ( for value in dictionary.values {...}) üzerinden yineleme yaparken kullanılan özelliği kullanabileceğini düşündüm , ancak bu bir hata döndürür:

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

Görünüşe göre, bir Arraydeğer döndürmek yerine , valuesyöntem daha soyut bir toplama türü döndürür. ArraySözlük değerlerini bir for-indöngüde ayıklamadan içeren bir yol var mı ?


1
Swift 5: colorsForColorSchemes.values
Juan Boero

Yanıtlar:


285

Swift 2.0 itibariyle, Dictionary'ın valuesözelliği şimdi a LazyMapCollectionyerine bir LazyBidirectionalCollection. ArrayTürü bu soyut toplama türünü kullanarak kendisini initialize bilir:

let colors = Array(colorsForColorSchemes.values)

Swift'in tür çıkarımı zaten bu değerlerin UIColornesne olduğunu biliyor, bu yüzden tür dökümü gerekli değil, bu güzel!


1
ayrıca yazılan nesnelerle bir dizi olarak da yayınlayabilirsiniz. harika çalışıyor! teşekkürler let colors = [CustomColorObject] (colorsForColorSchemes.values)
bolnad

6
Swift 2.0'daki gibi görünüyor, Dictionary.values ​​artık bir LazyBidirectionalCollection yerine LazyMapCollection döndürüyor. Ne yazık ki, .array bir LazyMapCollection öğesinde tanımlanmamıştır. Ancak dizi türleri kendini bir LazyMapCollection öğesinden nasıl başlatacağını bildiğinden, Array (dictionary.values) yolu hala iyi çalışır.
Tod Cunningham

8
Değerlerin sırasının beklenmedik olabileceğini unutmayın. Örneğin [0: "small", 1: "medium", 2: "large"]muhtemelen olacak DEĞİL oluşturmak["small", "medium", "large"]
Simon Bengtsson

55

Sözlüğü bir değer dizisiyle eşleyebilirsiniz:

let colors = colorsForColorScheme.map { $0.1 }

Kapatma, sözlükten bir anahtar / değer çifti alır ve yalnızca bir değer döndürür. Böylece, harita fonksiyonu bir dizi değer üretir.

Aynı kodun daha okunabilir versiyonu:

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

GÜNCELLEME

Xcode 9.0'dan sözlük değerlerine protokole valuesuyan özellik kullanılarak erişilebilir Collection:

let colors = colorsForColorScheme.values

Genellikle bunu bir dizi olarak istersiniz:

let colors = Array(dict.values)

ve bu kadar.


2
Ama aslında bu dizi almak için okunabilir bir yol renkleri izin = Array (colorsForColorScheme.values)
Renetik

1
bu çözümü seviyorum
Navy Seal

@pjuzeliunas buradaki en iyi cevap olduğu için, en son 2020'de düzenledim. Açıkçası gevşeyin, düzenleyin vb! alkış ve teşekkürler!
Fattie


8

üzerinde bir uzantı oluşturabilirsiniz LazyMapCollection

public extension LazyMapCollection  {

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

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


3

İlk olarak, aşağıdaki ifadeden, değişken (sözlük) adınızın colorsForColorScheme

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

siz değerleri colorsForColorSchemessözlükten almaya çalışırken,

let colors: [UIColor] = colorsForColorSchemes.values

size derleme zamanı hatası verecektir. Neyse ben bir yazım hatası olduğunu varsayalım ve sözlük adı colorsForColorSchemes. İşte çözüm:

Daha önce de belirtildiği gibi, .valuesswift'teki type inference özelliği nedeniyle, kodunuz işlevden döndürülen türün bir UIColor dizisi döndürdüğünü çıkarabilir. Bununla birlikte, Swift tipte güvenli olmak ister, bu nedenle değerleri colorsdizide sakladığınızda , bunu açıkça tanımlamanız gerekir. Hızlı 5 ve üstü için, şimdi aşağıdakileri yapabilirsiniz-

let colors = [UIColor](colorsForColorSchemes.values)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.