Ich habe ein Wörterbuch mit UIColor
Objekten, die durch einen Aufzählungswert gehasht wurden ColorScheme
:
var colorsForColorScheme: [ColorScheme : UIColor] = ...
Ich möchte in der Lage sein, ein Array aller Farben (der Werte) zu extrahieren, die in diesem Wörterbuch enthalten sind. Ich dachte, ich könnte die values
Eigenschaft verwenden, wie sie beim Durchlaufen von Wörterbuchwerten ( for value in dictionary.values {...}
) verwendet wird, aber dies gibt einen Fehler zurück:
let colors: [UIColor] = colorsForColorSchemes.values
~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'
Es scheint, dass Array
die values
Methode keinen der Werte zurückgibt , sondern einen abstrakteren Auflistungstyp. Gibt es eine Möglichkeit, Array
die Werte des Wörterbuchs zu erhalten, ohne sie in einer for-in
Schleife zu extrahieren ?
arrays
dictionary
swift
Stuart
quelle
quelle
colorsForColorSchemes.values
Antworten:
Ab Swift 2.0 gibt
Dictionary
dievalues
Eigenschaft von a jetzt aLazyMapCollection
anstelle von a zurückLazyBidirectionalCollection
. DerArray
Typ weiß, wie er sich mit diesem abstrakten Sammlungstyp initialisiert:Die Typinferenz von Swift weiß bereits, dass diese Werte
UIColor
Objekte sind, daher ist kein Typumwandeln erforderlich, was sehr schön ist!quelle
[0: "small", 1: "medium", 2: "large"]
wird wahrscheinlich NICHT generieren["small", "medium", "large"]
Sie können das Wörterbuch einem Array von Werten zuordnen:
Closure nimmt ein Schlüsselwerttupel aus dem Wörterbuch und gibt nur einen Wert zurück. Die Kartenfunktion erzeugt also ein Array von Werten.
Besser lesbare Version des gleichen Codes:
AKTUALISIEREN
Ab Xcode 9.0 kann auf Wörterbuchwerte über eine
values
Eigenschaft zugegriffen werden , die demCollection
Protokoll entspricht :Normalerweise möchten Sie es nur als Array:
und das ist es.
quelle
Verwenden
colorsForColorScheme.map({$0.value})
quelle
Sie können eine Erweiterung für erstellen
LazyMapCollection
colorsForColorSchemes.values.toArray()
odercolorsForColorSchemes.keys.toArray()
quelle
Aus der folgenden Aussage geht zunächst hervor, dass Ihr Variablenname (Wörterbuch) lautet
colorsForColorScheme
während Sie versuchen, die Werte aus dem
colorsForColorSchemes
Wörterbuch zu erhalten, als Sie dies tatenDies sollte zu einem Fehler bei der Kompilierung führen. Wie auch immer, ich gehe davon aus, dass Sie einen Tippfehler hatten und Ihr Wörterbuch heißt
colorsForColorSchemes
. Also, hier ist die Lösung -Wie bereits erwähnt, kann Ihr Code aufgrund der schnellen Typinferenz-Eigenschaft darauf schließen, dass der von der
.values
Funktion zurückgegebene Typ ein Array von UIColor zurückgibt. Swift möchte jedoch typsicher sein. Wenn Sie also die Werte imcolors
Array speichern , müssen Sie dies explizit definieren. Für Swift 5 und höher können Sie jetzt einfach Folgendes tun:quelle
Ich habe festgestellt, dass dies in Swift 5 am nützlichsten ist:
colorsForColorSchemes.allValues
Siehe Dokumente - https://developer.apple.com/documentation/foundation/nsdictionary/1408915-allvalues
quelle
d.values
. In der PraxisArray(d.values)