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?
Nette Frage. Hier ist meine bescheidene Sichtweise:
Ähnlich wie in einem Protokoll deklarierte Instanzmethoden.
Ja, genau wie Instanzfunktionen.
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.
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.
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%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%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%Tags und Links swift protocols swift-protocols