ProgrammationDéveloppeur mobile

Qu'est-ce que les méthodes static et class en Swift ? Quelles en sont les différences, où utiliser static et où utiliser class, et quelles erreurs peuvent survenir lors de leur utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • static func — permet de définir une fonction (ou une propriété) liée au type, qui ne peut pas être redéfinie (final).
  • class func — peut être redéfinie dans les sous-classes.

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 :

  • static interdit le override, class — l'autorise.
  • static est pratique pour les méthodes utilitaires sur les structures, énumérations et classes immuables.
  • class s'applique uniquement aux classes pour prendre en charge la redéfinition.

Questions pièges.

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.

Erreurs typiques et anti-patterns

  • Tenter de redéfinir une méthode static dans un héritier de classe — provoquera une erreur de compilation.
  • Utiliser class func là où aucune redéfinition n'est prévue (par exemple, pour des utilitaires mathématiques).
  • Appliquer class func à une structure/énumération — erreur de compilation.

Exemple de la vie réelle

Cas négatif

Utilisation de class func pour des utilitaires statiques d'une classe, alors qu'aucune redéfinition n'est prévue.

Avantages :

  • Flexibilité des signatures lors de l'évolution des exigences.

Inconvénients :

  • Possibilité de redéfinitions incontrôlées dans les sous-classes, ce qui peut entraîner un comportement incorrect de l'application.

Cas positif

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 :

  • Distinction claire des contrats d'héritage et des opérations autorisées.
  • Performance optimale pour les méthodes static.

Inconvénients :

  • Dans de grandes hiérarchies, il est difficile de suivre où static a été utilisé et où class l'est, ce qui nécessite de la minutie lors de la conception de l'API.