Beginnen wir mit der Definition von flatMap
für ein Wörterbuch starten, das ist die folgende:
func flatMap(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
Sie sehen, dass die transform
Schließung nur einen Parameter vom Typ nimmt Element
wo Element
ist nur ein typealias
für ein Tupel:
public typealias Element = (key: Key, value: Value)
So ist die erste und einzige Argument des Verschlusses sollen ein Tupel von zwei Elementen sein (key
vom Typ Key
und value
vom Typ Value
).
Nun, wenn Sie in Ihrem Code aussehen (die 3 in Swift kompiliert), werden Sie sehen, dass dies nicht der Fall ist, und Sie sollten fragen, warum dies auch in Swift arbeiten 3.
try flatMap({ (key, value) in
return try transform(key, value)
})
Ihre Schließung dauert 2 Argumente statt einer (key
vom Typ Key
und value
vom Typ Value
). Dies funktioniert in Swift 3 dank einer Funktion namens Destrukturierung wo der Compiler automatisch ein Tupel von 2 Elementen in 2 Argumente transformiert.
Aber diese Funktion ist seltsam, selten verwendet und gibt unerwartete Ergebnisse die meiste Zeit so hat es in Swift 4.
bearbeiten entfernt: Wie OOPer wies darauf hin, diese Funktion vorübergehend entfernt wurde Swift 4 Beta sollte aber wieder hinzugefügt werden, bevor die finale Version fertig ist.
Stattdessen sollten Sie schreiben werden:
try flatMap({ tupleArgument in
return try transform(tupleArgument.key, tupleArgument.value)
})
Und Ihre flatMap
Funktion wird:
func flatMap<KeyPrime, ValuePrime>(_ transform: (Key, Value) throws -> (KeyPrime, ValuePrime)?) rethrows -> [KeyPrime:ValuePrime] {
return Dictionary<KeyPrime, ValuePrime>(elements: try flatMap({ element in
return try transform(element.key, element.value)
}))
}
'Dictionary.init (Elemente:)' nicht in dem Swift Standard Library gefunden werden. Sie definieren es selbst? – OOPer
Ja, ich aktualisiere die Antwort –
Ich habe die Antwort aktualisiert –