Der folgende Code wird in Swift 1.2 kompiliert:
class myClass {
static func myMethod1() {
}
class func myMethod2() {
}
static var myVar1 = ""
}
func doSomething() {
myClass.myMethod1()
myClass.myMethod2()
myClass.myVar1 = "abc"
}
Was ist der Unterschied zwischen einer statischen Funktion und einer Klassenfunktion ? Welches soll ich wann verwenden?
Wenn ich versuche, eine andere Variable zu definieren class var myVar2 = ""
, heißt es:
In Klassen gespeicherte Eigenschaften von Klassen werden in Klassen noch nicht unterstützt. Meinten Sie "statisch"?
Wenn diese Funktion unterstützt wird, was ist der Unterschied zwischen einer statischen Variablen und einer Klassenvariablen (dh wenn beide in einer Klasse definiert sind)? Welches soll ich wann verwenden?
(Xcode 6.3)
Antworten:
static
undclass
beide ordnen eine Methode einer Klasse zu und nicht einer Instanz einer Klasse. Der Unterschied besteht darin, dass Unterklassenclass
Methoden überschreiben können. Sie könnenstatic
Methoden nicht überschreiben .class
Eigenschaften funktionieren theoretisch auf die gleiche Weise (Unterklassen können sie überschreiben), sind jedoch in Swift noch nicht möglich.quelle
final class
Funktion und 'statischer' Funktion innerhalb einer Klasse?final
kann verwendet werden , um weitere Überschreibungen abzuschneiden , wenn sie in einer Unterklasse verwendet. Die beiden haben ihren Platz, ich würde sagen, die Verwendungstatic
oderfinal
Verwendung einer Klassenfunktion ist trivial und hängt von Ihrer Stilwahl ab.static func foo(){}
in Swift ist wiepublic static final foo(){}
in Java?Ich versuchte es mit Mipadis Antwort und Kommentaren auf dem Spielplatz. Und dachte daran, es zu teilen. Bitte schön. Ich denke, Mipadis Antwort sollte als akzeptiert markiert werden.
quelle
In Bezug auf OOP ist die Antwort zu einfach:
Die Unterklassen können Klassenmethoden überschreiben, statische Methoden jedoch nicht .
Wenn Sie zusätzlich zu Ihrem Beitrag eine Klassenvariable deklarieren möchten (wie Sie es getan haben
class var myVar2 = ""
), sollten Sie dies wie folgt tun:quelle
Ich habe diese Verwirrung auch in einem meiner Projekte bekommen und fand diesen Beitrag sehr hilfreich. Versuchte das gleiche auf meinem Spielplatz und hier ist die Zusammenfassung. Hoffe , dass dies jemand mit gespeicherten Eigenschaften und Funktionen des Typs hilft
static
,final
,class
, übergeordnete Klasse Vars usw.Und hier sind die Testbeispiele:
quelle
Das Testen in Swift 4 zeigt Leistungsunterschiede im Simulator. Ich habe eine Klasse mit "class func" und eine Struktur mit "static func" erstellt und sie im Test ausgeführt.
statische Funktion ist:
Das Ausführen des gleichen Codes auf dem iPhone 7 unter iOS 10.3 zeigt jedoch genau die gleiche Leistung.
Hier ist ein Beispielprojekt in Swift 4 für Xcode 9, wenn Sie sich selbst testen möchten: https://github.com/protyagov/StructVsClassPerformance
quelle
Es gibt noch einen Unterschied.
class
kann verwendet werden, um nur Typeneigenschaften des berechneten Typs zu definieren . Wenn Sie eine gespeicherte Typeigenschaft benötigen, verwenden Siestatic
stattdessen."Sie definieren Typeneigenschaften mit dem statischen Schlüsselwort. Für berechnete Typeneigenschaften für Klassentypen können Sie stattdessen das Klassenschlüsselwort verwenden, damit Unterklassen die Implementierung der Oberklasse überschreiben können."
quelle
Wenn statische Methoden zu den obigen Antworten hinzugefügt werden, bedeutet dies, dass der Compiler weiß, welche Methode zur Laufzeit ausgeführt wird, da die statische Methode nicht überschrieben werden kann, während die Klassenmethode ein dynamischer Versand sein kann, da die Unterklasse diese überschreiben kann.
quelle
Es gibt noch einen Unterschied. Klasse kann verwendet werden, um nur Typeneigenschaften des berechneten Typs zu definieren. Wenn Sie eine gespeicherte Typeigenschaft benötigen, verwenden Sie stattdessen static.
Klasse: - Referenztyp
struct: - Werttyp
quelle
class
wird inReference Type
(Klasse) verwendet:static
wird inReference Type
undValue Type
(Klasse, Aufzählung) verwendet:[Referenz vs Werttyp]
quelle