Ich habe einige Experimente auf dem Spielplatz gemacht und einige Schlussfolgerungen gezogen.
Zusammenfassung
Wie Sie sehen können, ist es im Fall von class
die Verwendung von class func
oder static func
nur eine Frage der Gewohnheit.
Beispiel im Playground mit Erklärung:
class Dog {
final func identity() -> String {
return "Einmal ein Winsler, immer ein Winsler!"
}
class func talk() -> String {
return "Wuff wuff!"
}
static func eat() -> String {
return "Mjam mjam"
}
func sleep() -> String {
return "Zzz"
}
}
class Bulldog: Dog {
// Kann keine finale Funktion überschreiben
// override final func identity() -> String {
// return "Einmal ein Hund, aber jetzt bin ich eine Katze"
// }
// Kann keine "class func" überschreiben, aber neu deklarieren geht
func talk() -> String {
return "Ich bin ein Bulldog, und ich winsele nicht."
}
// Das gleiche wie "class func"
func eat() -> String {
return "Ich bin ein Bulldog, und ich esse nicht."
}
// Normale Funktion kann überschrieben werden
override func sleep() -> String {
return "Ich bin ein Bulldog, und ich schlafe nicht."
}
}
let hund = Dog()
let bulldogge = Bulldog()
// FINALE FUNKTION
//print(Dog.identity()) // Kompilierfehler
print(hund.identity()) // druckt "Einmal ein Winsler, immer ein Winsler!"
//print(Bulldog.identity()) // Kompilierfehler
print(bulldogge.identity()) // druckt "Einmal ein Winsler, immer ein Winsler!"
// => "final func" ist nur eine "normale" Funktion, die jedoch davon abhält, von Unterklassen überschrieben oder neu deklariert zu werden.
// CLASS FUNC
print(Dog.talk()) // druckt "Wuff wuff!", direkt von der Klasse aufgerufen
//print(hund.talk()) // Kompilierfehler, da "class func" dazu gedacht ist, direkt von der Klasse und nicht von einer Instanz aufgerufen zu werden.
print(Bulldog.talk()) // druckt "Wuff wuff!", da es von der Klasse Bulldog und nicht von der Instanz bullDogge aufgerufen wird.
print(bulldogge.talk()) // druckt "Ich bin ein Bulldog, und ich winsele nicht.", da talk() neu deklariert wird und von der Instanz bullDogge aufgerufen wird
// => "class func" ist wie eine "static" Funktion, die direkt von der Klasse oder einer abgeleiteten Klasse aufgerufen werden muss, neu deklariert werden kann, aber nicht zur Überschreibung gedacht ist.
// STATIC FUNC
print(Dog.eat()) // druckt "Mjam mjam"
//print(hund.eat()) // Kompilierfehler, da "static func" eine Typmethode ist
print(Bulldog.eat()) // druckt "Mjam mjam"
print(bulldogge.eat()) // druckt "Ich bin ein Bulldog, und ich esse nicht."
// NORMALE FUNKTION
//print(Dog.sleep()) // Kompilierfehler
print(hund.sleep()) // druckt "Zzz"
//print(Bulldog.sleep()) // Kompilierfehler
print(bulldogge.sleep()) // druckt "Ich bin ein Bulldog, und ich schlafe nicht."