Wie kann ich eine statische Funktion für ein Protokoll auf generische Weise aufrufen?

9

Hat es Sinn, eine statische Funktion in einem Protokoll zu deklarieren? Der Client, der das Protokoll benutzt, muss die Funktion auf einen Protokolltyp ansprechen, oder? Das bricht die Idee, den Typ, der dem Protokoll IMO entspricht, nicht kennen zu müssen. Gibt es eine Möglichkeit, die statische Funktion des Protokolls so aufzurufen, dass ich nicht den tatsächlichen Typ kennen muss, der meinem Protokoll entspricht?

    
KKendall 13.05.2016, 21:05
quelle

6 Antworten

10

Nette Frage. Hier ist meine bescheidene Sichtweise:

Gibt es einen Punkt, eine statische Funktion für ein Protokoll zu deklarieren?

Ähnlich wie in einem Protokoll deklarierte Instanzmethoden.

Der Client, der das Protokoll verwendet, muss die Funktion auf einen Protokolltyp anwenden, richtig?

Ja, genau wie Instanzfunktionen.

Das bricht die Idee, den Typ, der dem Protokoll IMO entspricht, nicht kennen zu müssen.

Nein. Sehen Sie sich den folgenden Code an:

%Vor%

Ich kenne den reellen Typ innerhalb der Variablen feline nicht. Ich weiß nur, dass es mit Feline übereinstimmt. Allerdings rufe ich eine statische Protokollmethode auf.

Gibt es dafür einen besseren Weg?

Ich sehe, Sie möchten eine statische Methode / Funktion aufrufen, die in einem Protokoll deklariert ist, ohne einen Wert zu erzeugen, der dem Protokoll entspricht.

In etwa so:

%Vor%

Ehrlich gesagt, ich weiß nicht den Grund, warum das nicht möglich ist.

    
Luca Angeletti 13.05.2016, 21:30
quelle
1

Danke @appzYourLife für die Hilfe! Deine Antwort hat meine Antwort inspiriert.

@appzYourLife hat meine Frage beantwortet. Ich hatte ein zugrunde liegendes Problem, das ich beheben wollte, und der folgende Code behebt mein Problem, also poste ich das hier, vielleicht hilft es jemandem mit meiner gleichen zugrundeliegenden Frage:

%Vor%     
KKendall 13.05.2016 22:11
quelle
1

Ja, das ist möglich:

Schnell 3

%Vor%     
iljn 11.06.2017 04:28
quelle
0

Die Verwendung von Protokollen wie Java-Schnittstellen ist selten eine gute Idee. Sie sind Metatypen, die zum Definieren von Verträgen gedacht sind, was eine ganz andere Sache ist.

Abgesehen davon, dass ich das verstehe, finde ich den einfachsten und effektivsten Weg, um das Äquivalent einer statischen Factory-Methode eines Protokolls zu erstellen, um eine freie Funktion zu schreiben.

Es sollte den Namen des Protokolls enthalten, in der Hoffnung, dass dadurch Namenskonflikte verhindert und die Auffindbarkeit verbessert wird.

In anderen Sprachen wäre createP ein statisches Mitglied von P, namens create und würde als P.create (...) aufgerufen, was die Auffindbarkeit drastisch verbessern und die Vermeidung von Namenskonflikten garantieren würde.

In swift ist dies jedoch keine Option für Protokolle. Wenn also Protokolle aus irgendeinem Grund wirklich als Ersatz für Schnittstellen verwendet werden, ist zumindest der Name des Protokolls im Funktionsnamen ein hässlicher Workaround, der immer noch etwas besser ist als nichts.

P.S. Falls das Ziel darin besteht, etwas wie eine Vererbungshierarchie mit Strukturen zu erreichen, sind Union-Stil-Enums das Werkzeug, das diesem Zweck dient:)

%Vor%     
yeoman 15.12.2016 09:03
quelle
0

Dies ist keine Antwort, sondern eine Erweiterung der Frage. Sprich ich habe:

%Vor%

Und ich habe einen generischen View-Controller, der verschiedene Typen verwaltet (generischer Typ ist .fetchableObjectType ... im Grunde NSFetchResult). Ich muss prüfen, ob ein bestimmter Objekttyp dem Protokoll entspricht, und wenn ja, rufen Sie ihn auf.

etwas wie:

%Vor%     
horseshoe7 15.09.2017 07:00
quelle
0

Ein bisschen spät zur Party auf diesem.

Hier ist meine Lösung zum "Hinzufügen" statischer Eigenschaften / Funktionen / Typen zu einem Protokoll mit typealias .

Zum Beispiel:

%Vor%

Dann kannst du das überall in deinem Code tun:

%Vor%     
John 27.02.2018 17:02
quelle