Operation für ein Array von Strukturen, die Equatable implementieren

8

Ich habe ein Array von verschiedenen Strukturen, die alle Equatable protocol implementieren und versuche, es an eine Funktion zu übergeben, die eine Sammlung where T.Iterator.Element: Equatable erwartet. Ich weiß, wie ich dieses Problem lösen kann, indem ich Klassen verwende und einfach ein class Vehicle: Identifiable, Equatable erstelle und dann Car und Tractor implementieren Vehicle . Aber ich würde gerne wissen, ob dies mit Structs und Protokollen möglich ist?

Hier ist ein künstliches Beispiel von dem, was ich versuche zu tun

%Vor%     
Marko Hlebar 23.12.2016, 09:15
quelle

1 Antwort

7

Das Problem besteht darin, dass Sie, wie der Fehler sagt, keine Protokolle mit Selbst- oder zugehörigen Typanforderungen als tatsächliche Typen verwenden können, da Sie die Typinformationen für diese Anforderungen verlieren würden. In diesem Fall würden Sie die Typinformationen für die Parameter der == -Implementierung verlieren - da Equatable angibt, dass sie vom gleichen Typ wie der konforme Typ sein müssen (d. H.% Co_de%).

Die Lösung besteht fast immer darin, einen Radiergummi zu erstellen. Wenn Erwartungstypen gleich sind, wenn ihre Self -Eigenschaften gleich sind, kann dies einfach so sein, dass nur die id -Eigenschaft gespeichert und in der id -Implementierung verglichen wird.

%Vor%

(Beachten Sie, dass ich Ihre == -Eigenschaft in ID umbenannt habe, um der Swift-Namenskonvention zu entsprechen)

Eine allgemeinere Lösung wäre jedoch das Speichern einer Funktion im Type-Radierer, die zwei beliebige id -konforme Instanzen basierend auf ihrer Vehicle -Implementierung nach dem Typcasting vergleichen kann Sie sind vom selben Typ wie der konkrete Typ, mit dem der Radiergummi erstellt wurde.

%Vor%

%Vor%     
Hamish 23.12.2016, 11:42
quelle

Tags und Links