2017-02-27 4 views
0

Ich habe versucht, die folgende Methode zu implementieren, um doppelte Einträge in einem Array von Wörterbüchern durch Vergleichen ihrer spezifischen Schlüssel zu entfernen. Allerdings wird diese Erweiterung Methode nicht aufgrund des Fehlers arbeiten:Erweiterung für Sequenzen von Wörterbüchern, deren Werte gleich sind

Binary operator == cannot be applied to two 'Equatable' operands

Das ist natürlich gleichzusetzen und gleicher Typ (Iterator.Element.Value), also warum es nicht funktioniert?

Ich sehe, dass es Equatable als einen bestimmten Typ, keine Einschränkung behandelt. Ich konnte es nicht mit dem generischen Typ oder dem Schreiben where Iterator.Element == [String: Any], Iterator.Element.Value: Equatable arbeiten lassen.

Haben Sie irgendwelche Hinweise, wie Sie das lösen können?

extension Sequence where Iterator.Element == [String: Equatable] { 
    public func removeDoubles(byKey uniqueKey: String) -> [Iterator.Element] { 
     var uniqueValues: [Iterator.Element.Value] = [] 
     var noDoubles: [Iterator.Element] = [] 
     for item in self { 
      if let itemValue = item[uniqueKey] { 
       if (uniqueValues.contains { element in 
        return itemValue == element 
       }) { 
        uniqueValues.append(itemValue) 
        noDoubles.append(item) 
       } 
      } 
     } 
     return noDoubles 
    } 
} 

Antwort

0

[String: Equatable] A ist eine Abbildung von Zeichenketten zu jede gleichzusetzen Typ. Es gibt kein Versprechen, dass jeder Wert der gleiche gleichwertige Typ sein kann. Allerdings ist es nicht möglich, ein solches Dictionary zu erstellen (da Equatable einen assoziierten Typ hat), so dass diese Erweiterung nicht auf jeden tatsächlichen Typ in Swift angewendet werden kann. (Die Tatsache, dass Sie hier keinen Fehler erhalten, ist IMO ein Fehler im Compiler.)

Die Funktion, die Sie benötigen, um diese Arbeit zu erledigen, ist SE-0142, die akzeptiert, aber nicht implementiert ist. Sie können eine Erweiterung auf Grundlage von Typeinschränkungen auf diese Weise nicht einschränken.

Es gibt viele Möglichkeiten zu erreichen, was Sie versuchen zu tun. Eine einfache Möglichkeit ist Ihre Gleichheit Funktion zu übergeben:

extension Sequence { 
    public func removeDoubles(with equal: (Iterator.Element, Iterator.Element) -> Bool) -> [Iterator.Element] { 
     var noDoubles: [Iterator.Element] = [] 
     for item in self { 
      if !noDoubles.contains(where: { equal($0, item) }) { 
       noDoubles.append(item) 
      } 
     } 
     return noDoubles 
    } 
} 

let noDupes = dict.removeDoubles(with: { $0["name"] == $1["name"] }) 

Das ist etwas anders als der Code, wie es sich verhält, wenn name fehlt, aber leichte Verbesserungen konnte das bekommen, was Sie wollen.

Das besagt, die Notwendigkeit für diese stark schlägt ein falsches Datenmodell vor. Wenn Sie diese Sequenz von Wörterbüchern haben und versuchen, eine Erweiterung dafür zu erstellen, haben Sie fast sicher eine Sequenz von Strukturen gemeint. Dann wird das einfacher. Der Punkt eines Wörterbuchs ist eine willkürliche Zuordnung von Schlüsseln zu Werten. Wenn Sie eine kleine Menge bekannter Schlüssel haben, die legal sind, ist das wirklich eine Struktur.

+0

Nicht sicher, wie SE-0142 hier helfen würde, ich denke, du meintest [parametrisierte Erweiterungen] (https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#parameterized-extensions)? :) – Hamish

+0

Ich meine parametrisierte Erweiterungen, aber ich habe SE-0142 vorausgesetzt. Wahrscheinlich falsch gelesen 142. –

+0

Vielen Dank für Ihre Hilfe. Das Problem ist, dass dies alles JSONs sind und ich beide zusammenführen muss - einen lokalen und einen entfernten, die vom Server kommen. Nach dem Zusammenführen wird es in Core Data gespeichert, und es scheint viel zu viel Aufwand zu sein, um einen anderen Strukturtyp zu erstellen, da dies NSManagedObjects sind, so dass ich sie vor dem Einfügen nicht verwenden kann. Im Speicherkontext und Speichern von ihnen alle und Vergleichen schien zu viel für diesen einfachen Zweck auch, also fuhr ich mit Versuchen auf dieser Erweiterung fort. – Suryu

Verwandte Themen