Wie vergleicht man zwei Arrays von Protokollen für Gleichheit in Swift?

8

Ich bin in eine Situation geraten, von der ich sicher bin, dass sie nicht ungewöhnlich ist. Ich habe zwei Arrays von Objekten, die einem Protokoll entsprechen, und ich möchte überprüfen, ob sie gleich sind.

Was ich wirklich gerne machen würde ist:

%Vor%

Dies führt jedoch zum Kompilierungsfehler:

Error:(10, 30) protocol 'Pattern' can only be used as a generic constraint because it has Self or associated type requirements

Gestützt auf diesen Beitrag erkenne ich, dass ich die Equatable-Vererbung auf meinem Protokoll verlieren und schieben muss es auf die konkreten 'Pattern'-Deklarationen. Obwohl ich wirklich nicht verstehe warum. Wenn ich definiere, wie die zwei Objekte basierend auf dem Protokoll gleich sind, durch Überladen ==, gibt es wirklich kein Problem, soweit ich sehen kann. Ich muss nicht einmal die tatsächlichen Typen kennen oder ob sie Klassen oder Strukturen sind.

Unabhängig davon, das ist alles gut und gut und ich kann jetzt concretePattern.isEqualTo(otherConcretePattern) vergleichen, aber das Problem bleibt, dass ich Arrays dieser Objekte nicht mehr vergleichen kann, wie ich ein Array eines konkreten Typs vergleichen kann, da die Array-Gleichheit darauf basiert, das zu überladen == operator.

Das Beste, was ich bisher geschafft habe, ist eine isEqualTo -Methode auf CollectionType über eine Erweiterung zu glomben. Dies erlaubt mir zumindest Arrays zu vergleichen. Aber ehrlich gesagt, dieser Code stinkt.

%Vor%

Gibt es wirklich keine andere Möglichkeit, dies zu tun? Bitte sag mir, dass mir etwas offensichtlich fehlt.

    
Daniel Wood 15.10.2015, 11:15
quelle

2 Antworten

5
  

Ich habe zwei Arrays von Objekten, die einem Protokoll entsprechen, und ich möchte prüfen, ob sie gleich sind.

Sie wollen also sagen, dass die beiden Arrays gleich sind, wenn alle Elemente in ihnen gleich sind und die Elemente alle dem Muster entsprechen. d. h.

Wenn a, b, c und d alles sind, was mit Pattern übereinstimmt, wollen Sie

%Vor%

Der einfachste Weg, dies zu tun, besteht darin, einen Gleichheitsoperator für zwei Musterfelder zu definieren, d. h.

%Vor%

Ich habe zwei Typen definiert, die mit Pattern übereinstimmen und verschiedene Gleichheitsvergleiche ausprobiert haben, und alles funktioniert

%Vor%     
JeremyP 15.10.2015, 15:21
quelle
1

Die Antwort Schnell :

%Vor%

Dies ist ein Muster (Wortspiel beabsichtigt), das ich selbst entwickelt habe, und es funktioniert sehr gut für Situationen wie diese. _Pattern ist ein automatisch implementiertes Protokoll mit der neuen Protokollerweiterungsfunktion und stellt eine vom Typ gelöschte Version von Pattern dar.

    
Vatsal Manot 15.10.2015 11:22
quelle