Wie kann ich den Aufruf einer statischen Funktion auf ein Protokoll, in einer generischen Art und Weise?
Gibt es einen Punkt, um die Deklaration einer statischen Funktion auf ein Protokoll? Der Kunde hat das Protokoll zum Aufruf der Funktion mit einem Typ konform zu dem Protokoll ohnehin Recht? Bricht der Gedanke, nicht zu wissen, die Art der konform zum Protokoll IMO. Gibt es eine Möglichkeit, rufen Sie die statische Funktion, die auf dem Protokoll in einer Weise, wo ich nicht haben, um zu wissen, die tatsächliche Typ konform zu meinem Protokoll?
- Empfehlen Sie um zu sehen, in diesem Frage und Ihre Antwort akzeptiert
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schöne Frage. Hier ist meine bescheidene Sicht:
Gibt es einen Punkt, um die Deklaration einer statischen Funktion auf ein Protokoll?
So ziemlich das gleiche wie Instanz-Methoden deklariert, in einem Protokoll.
Der client mit dem Protokoll zum Aufruf der Funktion mit einem Typ konform zu dem Protokoll ohnehin Recht?
Ja, genau wie Instanz-Funktionen.
, Bricht der Gedanke, nicht zu wissen, die Art der konform zum Protokoll IMO.
NÖ. Betrachten Sie den folgenden code:
Ich weiß nicht, den tatsächlichen Typ in der variable
feline
. Ich weiß nur, dass es nicht entsprechenFeline
. Ich bin jedoch der Aufruf eines statischen Protokoll-Methode.Gibt es einen besseren Weg, dies zu tun?
Ich sehe, Sie möchte aufrufen einer statischen Methode/Funktion deklariert, in einem Protokoll, ohne eine dem Wert entspricht, der Protokoll.
Etwas wie dieses:
Ehrlich gesagt, ich weiß nicht, der Grund, warum dies nicht möglich.
ProtocolName
's geben, die ich anrufen kann die statische Funktion, die auf dieser Art?? Ich werde Schlamassel mit es real schnell.let feline: Feline ...
ist, dass ich nicht wirklich wollen oder müssen eine Instanz haben, die derFeline
um rufen Sie die statische Funktion. Der einzige Grund, dass getan werden muss, ist, um herauszufinden, die zugrunde liegende Typ konform zu Protokoll.static func createRandomFeline() -> Feline
alsstatic func createRandomFeline() -> Self
. Nun, sehen Sie die Gründe? 🙂 Ein Protokoll hat keineself
daher Sie kann nicht rufen die Methoden auf.ja, das ist möglich:
Swift 3
Danke @appzYourLife für die Hilfe! Deine Antwort inspiriert meine Antwort.
@appzYourLife meine Frage beantwortet. Ich hatte eine zugrunde liegende Problem, das ich versuche zu lösen ist, und der folgende code löst mein Problem, also werde ich das hier posten, vielleicht hilft es ja jemandem mit meiner derselben zugrunde liegenden Frage:
struct S: MyProtocol {…}
rufen Sie einfachSomeClassThatUsesMyProtocolButDoesntConformToIt(protocolType: S.self)
Ein wenig spät, um die Partei auf diese ein.
Hier ist meine Lösung für die "hinzufügen" statische " Eigenschaften/Funktionen/Arten, um ein Protokoll mit
typealias
.Beispiel:
Dann können Sie diese überall in Ihrem code:
Mithilfe von Protokollen wie Java-interfaces ist selten eine gute Idee. Sie sind meta-Typen, bedeutete für die Definition von Verträgen, die eine ganz andere Art der Sache.
Dass gesagt wird, nur für den Punkt verstehen, ich finde die meisten einfachen und effektiven Weg für die Schaffung der äquivalent zu einer statischen factory-Methode, ein Protokoll zu schreiben, eine Kostenlose Funktion.
Sollte es den Protokoll-Namen, in der Hoffnung, dass name-clashes, und verbessern die Auffindbarkeit.
In anderen Sprachen, createP wäre ein statisches Element von P, die mit Namen erstellen und als P. create(...), die drastisch verbessern die Auffindbarkeit und garantieren, um zu verhindern, dass name-clashes.
Swift, obwohl, dies ist nicht eine option für die Protokolle, so dass, wenn die Protokolle sind für einige Grund wirklich als Ersatz für Schnittstellen, mindestens einschließlich dem Protokoll, das die Namen in der Funktion-name ist ein hässlicher workaround, der immer noch leicht besser als nichts.
P. S. im Fall das Ziel tatsächlich zu erreichen, so etwas wie eine Hierarchie-Vererbung mit einer struct -, union-Stil enums sind das Werkzeug, soll diesem Zweck dienen 🙂
Dies ist nicht eine Antwort, so viel wie es ist eine Erweiterung der Frage. Sage ich:
Und ich haben eine generische view-controller verwaltet die verschiedenen Typen (generische Typ ist .fetchableObjectType... im Grunde NSFetchResult). Ich brauche, um zu überprüfen, ob ein bestimmtes Objekt-Typ entspricht dem Protokoll, und wenn dem so ist, es aufzurufen.
etwas wie:
Hatte ich eine situation, wo ich erstellen müssen derselben
DomainModel
Objekt aus2
andere Antwort. also diese (static
Methode inprotocol
mir geholfen) Ansatz hat mir geholfen.