Schnelle Generika: Rückgabetyp basierend auf dem Parametertyp

9

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?

    
Ben 04.01.2016, 12:48
quelle

3 Antworten

12

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()

verwenden %Vor%     
JeremyP 04.01.2016, 13:11
quelle
1

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.

    
courteouselk 04.01.2016 13:18
quelle
0

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%     
Cristik 04.01.2016 15:04
quelle

Tags und Links