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% 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.
(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%