Wie fügen Sie einem Wörterbuch von Elementen in ein anderes Wörterbuch
Arrays in Swift Unterstützung der operator "+ = " fügen Sie den Inhalt von einem Array zu einem anderen. Gibt es eine einfache Möglichkeit zu tun, was für ein Wörterbuch?
zB:
var dict1 = ["a" : "foo"]
var dict2 = ["b" : "bar"]
var combinedDict = ... (some way of combining dict1 & dict2 without looping)
InformationsquelleAutor rustyshelf | 2014-06-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie definieren
+=
Betreiber fürDictionary
z.B.,func +=<K, V> (inout left: [K : V], right: [K : V]) { for (k, v) in right { left[k] = v } }
man swift ist erstaunlich
Weil wir implementieren müssen, um die Hälfte der Sprache selbst? Ja. Beeindruckt. Versteh mich nicht falsch, ich Liebe operator zu überladen. Ich weiß nur nicht Liebe, dass es für den grundlegenden Funktionen, sollten Sie gebaut werden.
Haha, dann machen Sie einen pull-request an das Swift-repo 😀 Da offenbar kann Apple nicht sein arsed
Ziehen gerade aus der SwifterSwift Bibliothek:
public static func +=(lhs: inout [Key: Value], rhs: [Key: Value]) { rhs.forEach({ lhs[$0] = $1}) }
InformationsquelleAutor shucao
Wie etwa
Fügt hinzu, dass alle dict2 die Schlüssel und Werte in dict1.
Dies ist eine großartige Lösung, aber für den Swift 4, Sie werden wahrscheinlich erhalten eine Fehlermeldung, die besagt
Closure tuple parameter '(key: _, value: _)' does not support destructuring
(zumindest zum Zeitpunkt des Schreibens dieses Artikels). Würde man brauchen, um die Umstrukturierung der Schließung gemäß [diese stackoverflow-Antwort] (stackoverflow.com/questions/44945967/...):InformationsquelleAutor jasongregori
Swift 4, sollte man Sie nutzen
Zusammenführen(_:uniquingKeysWith:)
:Beispiel:
Das zweite Beispiel in dieser Antwort ist das äquivalent von
[NSMutableDictionary addEntriesFromDictionary:]
.InformationsquelleAutor Vin Gazoil
Derzeit, mit Blick auf die Swift-Standard Library Reference für das Wörterbuch, gibt es keine Möglichkeit, um einfach aktualisieren Sie ein Wörterbuch mit einer anderen.
Schreiben Sie eine Erweiterung, um es zu tun
InformationsquelleAutor Rod
Swift 4 bietet
Zusammenführen(_:uniquingKeysWith:)
, also für Ihren Fall:Die Abkürzung für die Schließung gibt
$1
daher dict2 der Wert wird verwendet, wenn es einen Konflikt mit den keys.- (void)addEntriesFromDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;
. Mit Bezug auf das, was zu tun mit den Duplikaten, denn dort heißt es: "Wenn beide Wörterbücher enthalten den gleichen Schlüssel, den Erhalt Wörterbuch vorherigen Wert-Objekt für die Schlüssel gesendet wird eine release-Nachricht, und die neue Wert-Objekt nimmt seinen Platz ein.", so in der Swift-version, oder in merge(_:uniquingKeysWith:), die RÜCKFÜHRUNG der zweite Wert$1
ist das gleiche wie das, wasaddEntriesFromDictionary
tut.InformationsquelleAutor samwize
Ist es nicht eingebaut in die Swift-Bibliothek, aber Sie können hinzufügen, was Sie wollen mit operator-überladung, e.g:
Diese überlastungen der
+
Betreiber für die Wörterbücher, die Sie jetzt verwenden Sie zum hinzufügen von Wörterbüchern mit der+
Betreiber, e.g:Sie können tun, Weg mit
map
- and-drop die erstefor (k, v)...
Schleife, wenn Sie erklären, dieleft
parameter wievar
und dann nur Werte kopieren vonright
hinein.das würde mutieren, das Wörterbuch, das ist nicht das erwartete Verhalten für
+
infix-operator.Dank für, die. Ihre Antwort war wahrscheinlich genauer auf das Beispiel-code, den ich geschrieben, während das andere war mehr, was ich wollte anhand meiner Frage. Meine schlecht, jedenfalls gab Sie einen upvote 😉
Es ist nicht wirklich mutiert, da die
+
operator überladen ist nicht eine Methode, entwederDictionary
, es ist eine einfache Funktion. Die änderungen, die Sie machen, um eine variableleft
parameter wäre nicht außerhalb der Funktion sichtbar.InformationsquelleAutor mythz
Swift 3:
func merged(with dictionary: Dictionary<Key,Value>) -> Dictionary<Key,Value> {
var copy = self
dictionary.forEach { copy.updateValue($1, forKey: $0) }
return copy
}
InformationsquelleAutor Pavel Sharanda
Swift 2.0
Die
union
- Funktion hat der Wert an Sie übergeben werden, einevar
, d.h. dem Wörterbuch kopiert werden können, mutiert. Es ist ein bisschen sauberer alsfunc union(dictionary: Dictionary) -> Dictionary { var dict2 = dictionary; dict2.unionInPlace(self); return dict2 }
, wenn auch nur durch eine Zeile.var params sind veraltet und entfernt werden, Swift 3. Der bevorzugte Weg, dies zu tun ist, jetzt zu erklären, eine var in den Körper:
var dictionary = dictionary
. Von hier: github.com/apple/swift-evolution/blob/master/proposals/...Um Dinge zu machen, mehr geben-sicher, fügen Sie
<Key, Value>
denenDictionary
s.InformationsquelleAutor olsen
Unveränderlich
Ich lieber kombinieren/vereinen unveränderlich Wörterbücher mit
+
- operator, so habe ich es umgesetzt, wie:Veränderlich
Sehr elegant!!!
beabsichtigen Sie Werte von Links zu überschreiben, das Recht in Ihre "Unveränderlichen" Lösung? Ich denke du meinst zu haben
right.reduce(left)
, zumindest ist das das erwartete Verhalten imo (und es ist das Verhalten von deinem zweiten Beispiel) - dh.["A":1] + ["A":2]
ausgeben sollte["A":2]
Die Ausgabe entspricht dem code. Ich möchte den ersten Wert auf der rechten Seite, wie es jetzt ist.
InformationsquelleAutor ricardopereira
Keine Notwendigkeit, irgendwelche Wörterbuch-Erweiterungen jetzt. Swift(Xcode 9.0+) Wörterbuch hat eine Funktion für diese. Haben Sie einen Blick hier. Unten hier ist ein Beispiel, wie man es verwenden,
oldDictionary.merge(newDictionary) { $1 }
InformationsquelleAutor Vinayak Parmar
Einem besser lesbaren Variante mit einer Verlängerung.
InformationsquelleAutor orkoden
Können Sie versuchen, diese
InformationsquelleAutor Uttam Kumar
Können Sie auch verwenden, verringern Sie miteinander zu verschmelzen. Versuchen Sie es in der Spielplatz
d
undp
?d ist das anhaltende Ergebnis jeder iteration der Reduktion von block-und p ist das element der Kollektion wird reduziert.
dies scheint den Absturz in swift 3.0 beta
var-Parameter sind veraltet swift 3
Dies ist meine Lieblings-Lösung, mit der die hier genannten. Filter/map/reduce gewinnt erneut für große prägnante Lösungen.
InformationsquelleAutor farhadf
Empfehle ich die SwifterSwift Bibliothek. Allerdings, wenn Sie nicht wollen, verwenden Sie die gesamte Bibliothek und alle seine großen Erweiterungen können Sie nur nutzen, Ihre Erweiterung Dictionary:
Swift 3+
oh gut, war nicht ein fan
InformationsquelleAutor Justin Oroz
Können Sie iterieren über die Schlüssel-Wert Kombinationen, ob der Wert, den Sie Zusammenführen möchten, und fügen Sie Sie über die updateValue(forKey:) - Methode:
Nun alle Werte von dictionaryTwo habe Hinzugefügt dictionaryOne.
InformationsquelleAutor LeonS
Gleich wie @farhadf Antwort, aber angenommen für Swift 3:
InformationsquelleAutor Dmitry Klochkov
Können Sie ein
Dictionary
Erweiterung wie diese:Dann Nutzung ist als einfach wie die folgenden:
Wenn Sie bevorzugen einen Rahmen, der auch einige mehr praktische Funktionen dann Kasse HandySwift. Nur importieren Sie es zu Ihrem Projekt und Sie können mit dem obigen code , ohne jegliche Erweiterungen, um das Projekt selbst.
Ich habe soeben meine Antwort auf die entsprechenden Teil des Rahmens zu verhindern, die Einbeziehung der gesamten Bibliothek, wenn nur dieser kleine Teil benötigt wird. Ich halte den Hinweis auf den Rahmen für Menschen, die wollen, verwenden Sie mehrere der Funktionen. Ich hoffe, dies hilft, halten eine gute übung!
InformationsquelleAutor Dschee
Swift 3 -, Lexikon-Erweiterung:
InformationsquelleAutor aaannjjaa
Einige sogar mehr gestrafft überladungen für Swift 4:
InformationsquelleAutor John Montgomery
Können Sie die bridgeToObjectiveC () - Funktion, um das Wörterbuch ein NSDictionary.
Werden, wie die folgenden:
Dann können Sie konvertieren die NSDictionary(kombiniert) zurück oder tun, was auch immer.
Sorry, was meinst du genau?
Nur eine Präferenz. Scheint verworren zu Brücke zwischen den Sprachen. Besser zu halten innerhalb der Grenzen einer einzigen Sprache, und gleichzeitig lassen Sie obj-c sterben schneller.
Ja, ich habe diese Antwort förmlich auf den Tag, Swift angekündigt....... Also gab es einen Grund
Cool, thx für uns immer von den dunklen Zeiten 🙂 (ernsthaft!!)
InformationsquelleAutor Anton
Das Ergebnis ist ein NSMutableDictionary nicht ein Swift eingegeben Wörterbuch, aber die syntax zu verwenden ist die gleiche (
out["a"] == 1
in diesem Fall), so würde man nur ein problem haben wenn Sie Verwendung von Drittanbieter-code, der erwartet, dass ein Swift-Wörterbuch, oder wirklich brauchen, die Art der überprüfung.Die kurze Antwort ist, dass Sie hier eigentlich zu tun haben, um eine Schleife. Auch wenn Sie nicht eingeben es ausdrücklich, dass das, was die Methode, die Sie aufrufen (addEntriesFromDictionary: hier) tun. Ich würde vorschlagen, wenn Sie ein wenig unklar, warum dies wäre der Fall, sollten Sie überlegen, wie Sie den merge der Blattknoten von zwei B-Bäume.
Wenn Sie wirklich brauchen einen Swift native Wörterbuch geben zurück, würde ich vorschlagen:
Der Nachteil dieses Ansatzes ist, dass der dictionary-index - aber es geht - kann mehrmals wieder aufgebaut in der Schleife, also in der Praxis ist dies etwa 10x langsamer als die NSMutableDictionary Ansatz.
InformationsquelleAutor Jim Driscoll
Alle diese Antworten sind kompliziert. Dies ist meine Lösung für swift 2.2 :
InformationsquelleAutor Kevin ABRIOUX
Ich würde halt die Dollar Bibliothek.
https://github.com/ankurp/Dollar/#merge---merge-1
Führt alle Wörterbücher zusammen und die letzteren Wörterbuch überschreibt den Wert zu einem bestimmten Schlüssel
InformationsquelleAutor Andy
Meine Bedürfnisse waren unterschiedlich, brauchte ich zum Zusammenführen unvollständige, geschachtelte Datensätze ohne Stress.
Dieser war härter, als ich wollte, es zu sein. Die Herausforderung Bestand in der Zuordnung von dynamischen Typisierung statische Typisierung, und ich verwendete Protokolle, diese zu lösen.
Hervorzuheben ist auch, dass, wenn Sie verwenden das dictionary-literal-syntax, bekommen Sie eigentlich das Fundament-Typen, die nicht abholen, die Protokoll-Erweiterungen. Ich trieb meinen Bemühungen zu unterstützen, die wie ich nicht finden konnte, ein leicht zu überprüfen die Homogenität der Elemente aus der Sammlung.
InformationsquelleAutor Chris Conover
Swift 2.2
InformationsquelleAutor apinho
Hier ist eine nette Erweiterung, die ich schrieb...
verwenden:
Dann, dict1 werden geändert, um
InformationsquelleAutor Brian J. Roberts