Wie verketten Sie zwei Wörterbücher mit ein += operator überladen

Möchte ich verketten Sie zwei Wörterbücher mit ein += operator überladen anhand der nachstehenden Methode.

static func += <Key, Value> ( left: inout [Key : Value], right: [Key : Value]) {
    for (key, value) in right {
        left.updateValue(value, forKey: key)
    }
}

ODER

static func +=<Key, Value>( left: inout Dictionary<Key ,Value>, right: Dictionary<Key, Value>) {
    for (key, value) in right {
        left.updateValue(value, forKey: key)
    }
}

Mit dieser Umsetzung:

var properties = ["Key": "Value"]
var newProperties = ["NewKey": "NewValue"]
properties += newProperties

Bekomme ich folgende Fehlermeldung von xCode,

Nicht konvertieren kann der Wert des Typs ‚[String: Jede]‘ erwarteten Argumenttyp
‚inout [_ : ]‘ (aka ‚inout’Dictionary<, _>)

Es funktioniert nicht, kann jemand mir helfen können, oder wenn es nicht möglich ist, erklären Sie mir, warum?

  • Beachten Sie, dass Ihr code wie oben gepostet kompiliert ohne Probleme. Es ist immer eine gute Idee, erstellen Sie ein neues Projekt mit einem minimale reproduzierbare Beispiel um zu vermeiden, dass unklare Aussagen problem.
  • Technisch wird es nicht kompilieren auf der top-Ebene mit den Funktionen erklärt wird, wie static, aber ja – OP, bitte geben Sie immer eine MCVE. Normalerweise halte ich mich aus der Beantwortung MCVE-weniger Fragen, aber glaube nicht, dass die Erweiterung Vermutung war ein zu großer Sprung in diesem Fall (auch spooky timing-wie immer-Martin 🙂 ).
  • Sie haben Recht, ich habe vergessen, dass ich entfernt hatte, die „static“.
InformationsquelleAutor Guillaume | 2017-07-19

 

2 Replies
  1. 5

    Angenommen, Sie definieren diese überlastung in einem Dictionary Erweiterung, nicht vorstellen Key und Value generischen Platzhalter; verwenden Sie die generische Platzhalter bereits definiert Dictionary (als die, die Sie sich vorstellen, sind völlig unabhängig von Ihnen):

    extension Dictionary {
    
        static func += (left: inout [Key: Value], right: [Key: Value]) {
            for (key, value) in right {
                left[key] = value
            }
        }
    }
    
    var properties = ["Key": "Value"]
    let newProperties = ["NewKey": "NewValue"]
    properties += newProperties
    print(properties) // ["NewKey": "NewValue", "Key": "Value"]

    Und man konnte auch lassen Sie Swift ableiten dieser nur durch die Einnahme von Dictionary Operanden:

    extension Dictionary {
    
        static func += (left: inout Dictionary, right: Dictionary) {
            for (key, value) in right {
                left[key] = value
            }
        }
    }
  2. 11

    Swift 4 alternativen

    Da Swift 4 ist um die Ecke, werde ich hinzufügen, eine Antwort (Adressierung, insbesondere die Frage, oder der Titel), darunter weitere Ansätze zur Verfügung, die auf seine Freilassung.

    Die evolution Vorschlag

    Implementierung in Swift 4, und erlaubt die Verwendung von Methoden wie der mutiert merge(_:uniquingKeysWith:) (oder der nicht-mutierenden Zusammenführen(_:uniquingKeysWith:)) zum kombinieren von zwei Wörterbüchern, die auch Sie an wie zu beheben Schlüssel-Kollisionen.

    E. g., die Umsetzung Ihrer += Funktion mit merge(_:uniquingKeysWith:), und überschreiben Sie die bestehenden key-Werte (bei Kollisionen) mit den zugehörigen Wert in der rechten Seite Wörterbuch:

    extension Dictionary {
    
        static func += (lhs: inout Dictionary, rhs: Dictionary) {
            lhs.merge(rhs) { (_, new) in new }
        }
    }
    
    /* example usage */
    var dictA = ["one":   1,
                 "two":   2,
                 "three": 3]
    
    let dictB = ["three": 42,
                 "four":  4]
    
    dictA += dictB
    print(dictA)
       //["one": 1, "two": 2, "three": 42, "four": 4]
       // (any order is coincidental)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.