Static func vs class func en Swift : quelle est la différence ?

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Static func vs class func en Swift : guide exhaustif pour les développeurs

\n\n

Quiconque code en Swift se retrouve tôt ou tard face à un dilemme : static func ou class func ? À première vue, les deux mots-clés servent à créer des méthodes de niveau type. Mais la différence entre eux n'est pas un simple caprice syntaxique, c'est une distinction fondamentale liée à l'héritage et au polymorphisme. Dans cet article, nous allons une fois pour toutes comprendre ce qui différencie static func de class func en Swift, quand utiliser chacun d'eux, et comment ces connaissances vous aideront à écrire un code plus propre et plus flexible.

\n\n

Que sont les méthodes de type en Swift ?

\n\n

Avant de plonger dans les différences, rappelons les bases. En Swift, les méthodes se divisent en deux types :

\n\n
    \n
  • Méthodes d'instance (instance methods) — appelées sur un objet spécifique d'une classe, d'une structure ou d'une énumération.
  • \n
  • Méthodes de type (type methods) — appelées sur le type lui-même, et non sur une instance. Pour les déclarer, on utilise les mots-clés static ou class.
  • \n
\n\n

Les méthodes de type sont idéales pour les méthodes factory, les singletons, les fonctions utilitaires et les configurations qui ne sont pas liées à un état d'objet spécifique.

\n\n

Static func : le principal gardien de l'immuabilité

\n\n

static func est une méthode qui ne peut pas être redéfinie dans une sous-classe. Elle appartient exclusivement au type dans lequel elle est définie. Le mot-clé static fonctionne de la même manière pour les classes, les structures et les énumérations.

\n\n

Exemple : static func dans une classe

\n\n
class Animal {\n    static func describe() {\n        print("Je suis un animal. Mon essence ne peut pas être modifiée.")\n    }\n    \n    func speak() {\n        print("J'émets un son")\n    }\n}\n\nclass Dog: Animal {\n    // Erreur ! Impossible de redéfinir une méthode static\n    // override static func describe() { }\n    \n    override func speak() {\n        print("Ouaf-ouaf !")\n    }\n}\n\n// Utilisation\nAnimal.describe()  // "Je suis un animal. Mon essence ne peut pas être modifiée."\nDog.describe()     // Aussi "Je suis un animal. Mon essence ne peut pas être modifiée."\n
\n\n

Remarquez : Dog.describe() appelle la méthode de la classe parente. Bien que techniquement la sous-classe hérite de la méthode statique, il est impossible de la redéfinir. Ce comportement ressemble à final class func.

\n\n

Static func dans les structures

\n\n

Les structures (value types) supportent également les méthodes statiques :

\n\n
struct MathHelper {\n    static func square(_ number: Int) -> Int {\n        return number * number\n    }\n}\n\nlet result = MathHelper.square(5)  // 25\n
\n\n

Puisque les structures ne supportent pas l'héritage, static est ici la seule façon possible de déclarer une méthode de type.

\n\n

Class func : la flexibilité de l'héritage

\n\n

class func est une méthode de type qui peut être redéfinie dans une sous-classe. Elle est disponible uniquement pour les classes (reference types). Les structures et les énumérations ne peuvent pas utiliser class.

\n\n

Exemple : class func et sa redéfinition

\n\n
class Vehicle {\n    class func makeNoise() {\n        print("Le véhicule fait du bruit")\n    }\n    \n    class final func isMotorized() -> Bool {\n        return true\n    }\n}\n\nclass Car: Vehicle {\n    override class func makeNoise() {\n        print("La voiture vrombit : bzzzz !")\n    }\n    \n    // Erreur ! Impossible de redéfinir final class func\n    // override class func isMotorized() -> Bool { return false }\n}\n\n// Utilisation\nVehicle.makeNoise()  // "Le véhicule fait du bruit"\nCar.makeNoise()      // "La voiture vrombit : bzzzz !"\n
\n\n

Comme vous le voyez, class func se comporte comme une méthode virtuelle classique, mais est appelée au niveau du type. Cela ouvre des possibilités de polymorphisme au niveau des classes.

\n\n

Blogs

Book Recommendations