Array.map() erzeugt '[T]', die nicht die erwarteten Kontext-Ergebnis-Typ '[String: Eine?]'
Schreibe ich eine Erweiterung-Brücke, die Wörterbuch-Werte zwischen FirebaseDatabase und Eureka.
private extension Dictionary {
func firebaseFriendlyDictionary() -> [String: Any?] {
return self.map({ (key: String, value: Any?) -> (String, Any?) in
if value is NSDate {
return (key, (value as! NSDate).timeIntervalSince1970)
}
return (key, value)
})
}
}
Aber ich geworfen bekommen diesen Fehler wenn ich versuche zu bauen:
map produces '[T]', not the expected contextual result type '[String: Any?]'
- Ich denke, meine Frage hat mehr zu tun mit meinem Verständnis von Swift
Array.map()
eher als Eureka sich - Dieser hat mir geholfen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem liegt mit der Tatsache, dass
map
gibt immer eineArray
auch, wenn angewandt, auf eineDictionary
. Deine Fehlermeldung bedeutet im Grunde, dass Sie erklärt Ihre Methode als Rückgabe einDicitonary
, aber die Aussage im inneren gibt einArray
([T]
- also ein Array mit Objekten der einige Typ T). In Ihrem Fall, wird das array zurückgegebenmap
enthalten Tupel (mehr über Sie hier). In diesem Fall sieht es aus wie ein Schlüssel-Wert-paar, aber nicht äquivalent zu einem key-value-pair-Mädchen in einem Wörterbuch. Grundsätzlich Tupel ermöglichen es Ihnen, mehr zurück, als ein Wert/Objekt von der Methode. Sie können von Ihnen denken, als der anonyme Strukturen.Meiner Meinung nach, gibt es keine Notwendigkeit zur Verwendung eines
map
zu erreichen, was Sie brauchen - die Lösung von Herrn Xcoder ist der Weg zu gehen.[(String, Any?)] ≠ [String: Any?]
. Danke!!!Wenn Sie wirklich wollen, etwas zu verwenden, funktional wie
map
, die Methode, die Sie wirklich wollen, istreduce
.Werde ich zeigen. Um die Dinge so klar wie möglich, ich denke, es wird helfen, wenn wir trennen die transformation, auf die Sie Ihre Werte sind ausgesetzt in eine eigene Funktion:
Okay, also hier ist unser test Wörterbuch:
Nun sind wir bereit, um für
reduce
. Sie übergibt zwei Parameter in seiner Funktion. Die erste ist die "Akkumulator", wo wir halten Gebäude, um das ultimative Ergebnis, das auch in diesem Fall ist ein anderes Wörterbuch. Der zweite ist ein element der ursprünglichen Wörterbuch, dargestellt als eine Tupel von Schlüssel-Wert-Paarekey
undvalue
:Und wenn wir es untersuchen
d2
sehen wir, dass wir haben die richtige Antwort:initialResult
von meinem reduzieren, ist ein let konstant...reduce
- Funktion, die ich zuordnendict
in einevar
; ist es das, was du redest? Die Zeile ist entscheidend. (Gut, es ist alles wichtig, alles hängt zusammen.)Ich konnte nicht herausfinden, wie um diesen Fehler zu beheben, noch habe ich es gelungen, das erreichen der gewünschten Ergebnisse mit einer Erweiterung oder eines
map()
, aber ich habe eine alternative Lösung für das problem, mit einem Funktion:Deklarieren Wörterbuch:
Funktion:
Verwendung:
Testen:
Vorausgesetzt, wir haben das Datum
2017-02-04 16:42:46 +0000
die Ausgabe ist1486226566.2349629
korrekt ist.Warum nicht Zuordnung das Wörterbuch? Als Losiowaty wies in seiner ausgezeichneten Antwort,
map
gibt immer eineArray
, in diesem Fall einArray
von Tupel([T]
). Meiner Meinung nach eine map-Funktion ist nicht erforderlich, in diesem Kontext, plus es erfordert mehr code zu erreichen.Hoffe, das hilft!