Angenommen, ich habe eine Sammlung von Objekten, die von einer gemeinsamen Oberklasse erben (dies ist in diesem Fall den Protokollen vorzuziehen):
%Vor%Ich möchte eine generische Suchfunktion wie folgt erstellen:
%Vor%Dies könnte verwendet werden, um nach einem bestimmten Untertyp zu suchen und ein spezifischeres Array von Ergebnissen zurückzugeben:
%Vor%Ich glaube, dass Generika hier helfen können, aber nicht sehen können, wo Zwänge platziert werden sollten. Ist es möglich?
Nun, bemerkenswert, das funktioniert ...
%Vor%... vorausgesetzt, Sie weisen das Ergebnis einem explizit eingegebenen Typ zu, wie im folgenden Beispiel:
%Vor%T wird jeweils vom angeforderten Rückgabetyp abgeleitet. Die Funktion selbst filtert das ursprüngliche Array basierend darauf, ob die Elemente vom erforderlichen Typ sind, und forciert dann die gefilterten Ergebnisse auf den korrekten Typ.
Wenn Sie einen "zusätzlichen Filter" wünschen, müssen Sie die Ergebnisse nicht explizit eingeben, solange T aus Ihrer zusätzlichen Filterfunktion abgeleitet werden kann.
%Vor%BEARBEITEN
Eine schlankere Version der Funktion filterType
würde flatMap()
Das ist die engste Annäherung, die ich mir vorstellen kann:
%Vor%Verwendung:
%Vor% Technisch gesehen können Sie auch ohne type
-Argument im obigen Beispiel auskommen, aber dann müssen Sie Empfänger explizit eingegeben haben ( bar
und baz
im obigen Beispiel), so dass Swift die Typen für richtig ableiten kann Sie und verwenden Sie die richtige Version der generischen Funktion.
Sie können die Funktion wie folgt implementieren:
%Vor%Anwendungsbeispiel:
%Vor%Beachten Sie, dass ich kein Fan von Zwangscasting bin, aber in diesem Szenario sollte es keine Probleme verursachen.
Oder die ausführlichere Version der Funktion mit einer weniger erzwungenen Umwandlung:
%Vor%