Dans les langages de programmation de la famille C (y compris Objective-C), il y avait toujours des "méthodes de classe" (class methods). Swift a introduit deux types de méthodes pour les types : static et class. Elles permettent d'appeler des méthodes sur le type lui-même, et non sur une instance. Static est utilisé pour les structures, les énumérations et les classes sans possibilité de redéfinition, class — pour les classes avec possibilité de redéfinition dans les sous-classes.
Problème : La confusion entre static et class se produit dans une hiérarchie de classes, où l'héritage est possible et où l'on souhaite autoriser ou interdire la redéfinition de méthodes/propriétés pour les descendants.
Solution :
Exemple de code :
class Animal { class func makeSound() { print("Un bruit d'animal générique") } static func kingdom() -> String { "Animalia" } } class Dog: Animal { override class func makeSound() { print("Wouaf !") } // override static func kingdom() — erreur : static ne peut pas être redéfini ! } Animal.makeSound() // Un bruit d'animal générique Dog.makeSound() // Wouaf ! print(Animal.kingdom()) // Animalia
Caractéristiques clés :
Peut-on utiliser class func dans une structure ou une énumération ?
Non, class func est autorisé uniquement pour les classes. Les structures et les énumérations ne supportent que les méthodes et propriétés static.
Une propriété static peut-elle être calculée et/ou mutable (var) ?
Oui, une propriété static peut être à la fois calculée (computed) et stockée (stored), et être définie via static var. Pour les structures et les énumérations, c'est le seul moyen de rendre une propriété accessible via le type lui-même, et non via une instance.
Exemple de code :
struct Counter { static var totalCount = 0 static var nextId: Int { totalCount += 1 return totalCount } }
Peut-on appeler une méthode de classe via une instance de classe ?
Oui, mais ce n'est pas recommandé : une méthode de classe se rapporte toujours au type, et non à un objet spécifique, donc le comportement de type d'origine ou la redéfinition sera appelé, sans lien avec un objet spécifique.
Utilisation de class func pour des utilitaires statiques d'une classe, alors qu'aucune redéfinition n'est prévue.
Avantages :
Inconvénients :
Utilisation de static pour des constantes et des utilitaires, class — pour des méthodes de fabrique, qui peuvent réellement être modifiées dans les sous-classes.
Avantages :
Inconvénients :