Swift Erklären Klasse Func im Protokoll
Hatte ich folgende Verwirrung. Soweit ich weiß ist der Hauptunterschied zwischen statische und Klasse Schlüsselwörter bei der Deklaration der Methode ist, dass die zweite könnte man überschreiben in Unterklassen.
Das problem
Allerdings, wenn ich erklären ein protocol in Swift 1.2 wie dieses:
protocol MyProtocol
{
class func dummyClassMethod()
}
compiler gibt eine Fehlermeldung:
Klassenmethoden dürfen nur innerhalb von Klassen; verwenden Sie 'static' deklarieren
eine statische Methode
Die Fehlermeldung ist ziemlich eindeutig wie offensichtlich MyProtocol ist nicht eine Klasse, jedoch möchte ich eine Klasse func Teil des Protokolls.
, Was ich versucht habe
Ich habe festgestellt, dass wenn ich erkläre Schnittstelle im Protokoll als statische, compiler freut sich, und ich konnte verwenden Sie diese statische Methode in allen Klassen, in denen dieses Protokoll:
protocol MyProtocol
{
static func dummyClassMethod()
}
Die Frage
Also meine Frage ist im Grunde ist das richtig? Diese Erklärung besagt, dass meine Klasse die Methode nicht überschrieben werden kann, bei Kindern jedoch in meiner Umsetzung, ich könnte schreiben, und verwenden Sie die folgenden:
class ClassA: MyProtocol
{
class func dummyClassMethod() {
}
}
class ClassB: ClassA
{
override class func dummyClassMethod() {
}
}
und jetzt meine dummyClassMethod ist nicht statisch, mehr...
-
Compiler ist Ok und alles funktioniert - aber warum?
-
Ist es spezifisch auf die Tatsache, dass die Schnittstelle selbst ist statisch, aber
es ist die Umsetzung nicht? - Gibt es eine bessere alternative für die Klasse func-im-Protokolle?
Objective-C-Lösung
In ObjC dies ist sehr einfach und kompilieren & laufen einwandfrei:
@protocol MyProtocol
+(void)dummyClassMethod;
@end
- Ich weiß, dass es sich nicht auf deine Frage, aber warum müssen Sie Unterklassen?
- Ich nicht an der Zeit, dies zu schreiben, aber wer weiß in der Zukunft. Ich bin mehr in das Verständnis, wie es funktioniert, also ich kann Sie richtig verwenden.
- war diese Frage lösen op? Ich bin neu in swift.
- Nicht im Swift-1.2, ich habe keine Erfahrung mit 2.0, obwohl...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie überprüfen, Die Dokumentation von Apple (Unterabschnitt Methode Anforderungen).
Dort sagt:
In der Praxis, können Sie es wie folgt:
Zunächst deklarieren Sie Ihr Protokoll:
Dann in Ihrer
class
Sie haben 2 Optionen:Erste:
Zweite:
Ich hoffe, dies kann klären Sie Ihre Zweifel..
func
static
im Protokoll, sondern einfach diese Tatsache ignorieren und verwenden Sie es als eineclass func
. Vor allem, dastatic
impliziertfinal class
und in einem Protokoll die func ist alles andere als final, da muss es umgesetzt werden. Wer noch keinen Einblick, warum Apple würde das design der Sprache wie diese?private
,public
,internal
,final
,static
, etc., Lesen Sie einfach die doc.static
entsprichtfinal class
beim Einsatz in Klassen, sondern hat eine andere Bedeutung insgesamt, wenn in ein Protokoll. Ich sage nur Swift-Nutzung erfordernstatic
im Protokolle nicht wirklich sinnvoll, wenn Sie ignoriert die implizitefinal
dass es beim überschreiben in einer Klasse. Es würde mehr Sinn machen, wenn erforderliche Protokolle mitclass
, nichtstatic
wie es wäre, lassen Sie es bis zu der Implementierung, um festzustellen, ob Sie wollten, dass die Methodefinal
.final
undstatic
haben ein ähnliches Verhalten, was ich gesehen habe, in meiner Erfahrung, die Apple-Konvention ist die Verwendungfinal
fürinheritance
(classes
Verhindern, Überschreibt -> developer.apple.com/library/ios/documentation/Swift/Conceptual/...), undstatic
fürconformance
(protocols
- Methode Anforderungen -> developer.apple.com/library/ios/documentation/Swift/Conceptual/...).class
Schlüsselwort innerhalb Protokolle und später bei der Umsetzung entscheiden, ob die Kinder außer Kraft setzen kann. Vielleicht haben Sie gewählt, weil-Protokoll angewandt werden kann, enum und Strukturen auch und das Schlüsselwort class, verwirrend sein könnte.https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html
Nach diesem Protokoll definition wird es vernünftig, dass
Machen protocol-Methode static und final implementieren, die Methode mit dem Schlüsselwort static
und jetzt ist Sie nicht überschreiben dummyClassMethod Funktion mehr. Wenn Sie möchten, um zu verhindern, dass das überschreiben nur müssen Sie erklären, Protokoll-Methode als final. Über Funktionen der Klasse, Sie waren nicht voll unterstützt Swift 1.0 und jetzt in Swift 1.2 ich denke, dass Sie in Richtung statische Funktionen