In programmeertalen van de C-familie (inclusief Objective-C) zijn er altijd "klassenmethoden" (class methods) geweest. In Swift zijn er twee soorten van dergelijke methoden voor types - static en class. Hiermee kunnen methoden op het type zelf worden aangeroepen in plaats van op een instantie. Static wordt gebruikt voor structs, enums en klassen zonder mogelijkheid tot overschrijving, class - voor klassen met de mogelijkheid tot override in afgeleiden klassen.
Probleem: Verwarring tussen static en class ontstaat in een klassenhiërarchie, waar overerving mogelijk is en je wil toestaan of verbieden dat methoden/eigenschappen worden overschreven voor afgeleiden klassen.
Oplossing:
Voorbeeldcode:
class Animal { class func makeSound() { print("Some generic animal sound") } static func kingdom() -> String { "Animalia" } } class Dog: Animal { override class func makeSound() { print("Woof!") } // override static func kingdom() - fout: static kan niet worden overschreven! } Animal.makeSound() // Some generic animal sound Dog.makeSound() // Woof! print(Animal.kingdom()) // Animalia
Belangrijkste kenmerken:
Kan class func worden gebruikt in struct of enum?
Nee, class func is alleen toegestaan voor klassen. Structs en enums ondersteunen alleen static methoden en eigenschappen.
Kan een static eigenschap berekend en/of veranderlijk (var) zijn?
Ja, een static eigenschap kan zowel berekend (computed) als opgeslagen (stored) zijn en worden gedefinieerd via static var. Voor structs en enums is dit de enige manier om een eigenschap beschikbaar te maken via het type zelf, in plaats van via een instantie.
Voorbeeldcode:
struct Counter { static var totalCount = 0 static var nextId: Int { totalCount += 1 return totalCount } }
Kan een class method worden aangeroepen via een instantie van de klasse?
Ja, maar dit wordt niet aanbevolen: een class method behoort altijd tot het type en niet tot een specifiek object, dus het oorspronkelijke type of de overschrijving zal worden aangeroepen, wat geen betrekking heeft op een specifiek object.
Gebruik van class func voor statische utility-methoden van de klasse, terwijl overschrijvingen niet worden verwacht.
Voordelen:
Nadelen:
Gebruik van static voor constanten en utilities, class - voor fabrieksmethoden die daadwerkelijk kunnen worden gewijzigd in afgeleiden klassen.
Voordelen:
Nadelen: