Ich kann diese Definitionen in der Swift-Bibliothek sehen:
extension Bool : BooleanLiteralConvertible {
static func convertFromBooleanLiteral(value: Bool) -> Bool
}
protocol BooleanLiteralConvertible {
typealias BooleanLiteralType
class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self
}
Was ist der Unterschied zwischen einer als definierten Elementfunktion static func
und einer als definierten Elementfunktion class func
? Ist es einfach static
für statische Funktionen von Strukturen und Aufzählungen sowie class
für Klassen und Protokolle? Gibt es noch andere Unterschiede, die man kennen sollte? Was ist der Grund für diese Unterscheidung in der Syntax selbst?
class func
? Mit den Informationen, die wir jetzt haben, scheint diese Unterscheidung ziemlich nutzlos zu sein, nicht wahr?class func
serror: class methods are only allowed within classes; use 'static' to declare a static method
Antworten:
Das ist der Hauptunterschied. Einige andere Unterschiede bestehen darin, dass Klassenfunktionen dynamisch ausgelöst werden und von Unterklassen überschrieben werden können.
Protokolle verwenden das Schlüsselwort class, schließen jedoch Strukturen nicht von der Implementierung des Protokolls aus, sondern verwenden stattdessen nur static. Die Klasse wurde für Protokolle ausgewählt, sodass kein drittes Schlüsselwort für die Darstellung von statisch oder klasse erforderlich sein muss.
Von Chris Lattner zu diesem Thema:
Und hier ist ein Ausschnitt, der einige der Überschreibungsverhalten von Klassenfunktionen zeigt:
quelle
static func myFunc()
stattdessen verwendenclass func myFunc
, wird der folgende Fehler l angezeigt: Die statische Methode kann nicht überschrieben werden . Warum? Weil es so ist, als wäre es mit markiert wordenfinal
. Für mehr Informationen. Siehe die Antwort von nextD unten. Auchx.dynamicType
wurde jetzt durchtype(of:x)
Um es klarer zu machen, mache ich hier ein Beispiel:
static func
ist das gleiche wiefinal class func
Da dies der Fall ist
final
, können wir es in der folgenden Unterklasse nicht überschreiben:quelle
class func
unterscheidet sich von normal,func
obwohl beide überschrieben werden können. Istfunc
aber für eine Instanz / ein Objekt undclass func
kann über die Klasse wieClassA.classFunc()
Ich habe einige Experimente auf dem Spielplatz gemacht und einige Schlussfolgerungen gezogen.
TL; DR
Wie Sie sehen können
class
, ist die Verwendung vonclass func
oderstatic func
nur eine Frage der Gewohnheit.Spielplatzbeispiel mit Erklärung:
quelle
class
Funktionen vs. statische Bindung von Funktionenstatic
.class func
überschreibbar?class func
ist überschreibbar. Ich hätte das anders gewählt; liebe die Forschung und das Beispiel!Quelle: Die Swift-Programmiersprache - Typvariableneigenschaften
quelle
Laut dem von Apple veröffentlichten Swift 2.2-Buch:
„Sie geben Typmethoden an, indem Sie das
static
Schlüsselwort vor das Schlüsselwort func der Methode schreiben . Klassen können dasclass
Schlüsselwort auch verwenden , damit Unterklassen die Implementierung dieser Methode durch die Oberklasse überschreiben können . “quelle
Ab Swift2.0 sagt Apple:
"Stellen Sie den Anforderungen an Typeneigenschaften immer das statische Schlüsselwort voran, wenn Sie sie in einem Protokoll definieren. Diese Regel gilt auch dann, wenn den Anforderungen an Typeneigenschaften die Klasse oder das statische Schlüsselwort vorangestellt werden kann, wenn sie von einer Klasse implementiert werden:"
quelle
Dieses Beispiel wird jeden Aspekt klären!
Ausgabe:
quelle
Dies wird als Typmethode bezeichnet und wie Instanzmethoden mit Punktsyntax aufgerufen. Sie rufen jedoch Typmethoden für den Typ auf, nicht für eine Instanz dieses Typs. So rufen Sie eine Typmethode für eine Klasse namens SomeClass auf:
quelle
static
undclass
Schlüsselwörtern.