Logo de Swift en orange sur fond gris qui sert de hero de présentation de la formation sur les fondamentaux de Swift

Extension

Les extensions te permettent d’ajouter de nouvelles fonctionnalités à des types existants, comme les classes, les structures, les énumérations ou même les types de base comme Int ou String. C’est pratique pour enrichir des types que tu n’as pas créés toi-même, sans modifier leur code d’origine.

Syntaxe


extension NameType {
    
}
Pour déclarer une extension, utilise le mot-clé extension suivi du nom du type à étendre et d’une paire d’accolades contenant le nouveau code.

Extension d’un type existant


extension Int {
    func squared() -> Int {
        return self * self
    }
}

let number = 5
print(number.squared()) 

Lecture dans la console ->
2

L’exemple ci-dessus montre l’intérêt des extensions. Ici, nous avons ajouté la méthode squared() qui permet de retourner un entier avec sa valeur au carré. Cette méthode est utilisable sur tous les nombres entiers (Int). Comme il est impossible de modifier directement les types natifs de Swift, les extensions sont très utiles pour ajouter des fonctionnalités supplémentaires à ces types.

 Extension d’un type personnalisé


class Car {
    var make: String
    var model: String
    var year: Int

    init(make: String, model: String, year: Int) {
        self.make = make
        self.model = model
        self.year = year
    }
}

extension Car {
    func startEngine() -> String {
        return "La voiture \(make) \(model) démarre"
    }
}

let myCar = Car(make: "Renault", model: "Scenic", year: 2020)
print(myCar.startEngine())  

/*
Lecture dans la console ->
La voiture Renault Scenic démarre
*/<br />
extension Car {
    var age: Int {
        return 2024 - year
    }
}

print("Ma voiture a \(myCar.age) années d'ancienetté")  

/*
Lecture dans la console ->
Ma voiture à 4 années d'ancienetté 
*/
}
L’extension permet d’étendre un type personnalisé en ajoutant de nouvelles fonctionnalités sans modifier son code source.

 Ajouter des initialiseurs


extension Car {
    convenience init(make: String, model: String) {
        self.init(make: make, model: model, year: 2024, color: "White")
    }
}


let newCar = Car(make: "Honda", model: "Civic")

print("Ma nouvelle voiture est une \(newCar.year) le modèle est une \(newCar.make) \(newCar.model) et elle est de couleur \(newCar.color).")

/*
Lecture dans la console ->
Ma nouvelle voiture est une 2024 le modèle est une Honda Civic et elle est de couleur blanche
*/

Une extension permet d’ajouter des initialisateurs, y compris des convenience init, pour enrichir un type sans toucher à sa définition d’origine. Les convenience init appellent un autre initialisateur du type pour garantir une configuration complète et rendent la création d’instances plus simple, notamment pour gérer des configurations par défaut ou fréquentes.

Extension d’un protocole


protocol Vehicule {
    var description: String { get }
    func describe()
}

extension Vehicule {
    func describe() {
        print(description)
    }
}

struct Moto: Vehicule {
    var model: String
    var year: Int
    
    var description: String {
        return "Modèle :  \(model), année : \(year)"
    }
}

struct Truck: Vehicule {
    var model: String
    var year: Int
    var capacity: Int
    
    var description: String {
        return "Modèle :\(model), année: \(year), capacité: \(capacity) tonnes"
    }
}

Les extensions marchent également sur les protocoles.

 Extensions pour conformer à un protocole



protocol Descriptible {
    var description: String { get }
}

extension Car: Descriptible {
    var description: String {
        return "\(make) \(model)"
    }
}

print("Ma voiture est une \(myCar.description).")  

/*
Lecture dans la console ->
Ma voiture est une Honda Civic
*/
Les extensions sont souvent utilisées pour faire en sorte qu’un type soit conforme à un protocole.

Exercices Pratiques

Exo extension

Télécharger le playground

Accède aux consignes directement en téléchargeant le playground.

⚠️ Les consignes que tu trouveras dans le playground ne sont pas verrouillées. Fais attention à ne pas les effacer par inadvertance ! 

Objectif

Les extensions sont pratiques pour ajouter de nouvelles fonctionnalités aux types existants, comme les classes, structures, énumérations ou même les types de base (comme Int ou String). Elles te permettent d’enrichir ces types sans modifier leur définition d’origine. Avec les extensions, tu peux ajouter des méthodes, des propriétés calculées, des initialisateurs ou encore conformer un type à un protocole. Elles sont parfaites pour structurer ton code, le rendre plus clair et réutilisable. En maîtrisant les extensions, tu pourras tirer pleinement parti de la modularité et de la flexibilité offertes par Swift.

Note

En Swift, même les types natifs comme Int, String ou Array peuvent être étendus, ce qui te permet d’ajouter des fonctionnalités personnalisées à des types que tu utilises tous les jours. Par exemple, tu pourrais créer une méthode qui transforme un entier en emoji !

Exercices Pratiques

Exo extension

Télécharger le playground

Accède aux consignes directement en téléchargeant le playground.

⚠️ Les consignes que tu trouveras dans le playground ne sont pas verrouillées. Fais attention à ne pas les effacer par inadvertance ! 

Objectif

Les extensions sont pratiques pour ajouter de nouvelles fonctionnalités aux types existants, comme les classes, structures, énumérations ou même les types de base (comme Int ou String). Elles te permettent d’enrichir ces types sans modifier leur définition d’origine. Avec les extensions, tu peux ajouter des méthodes, des propriétés calculées, des initialisateurs ou encore conformer un type à un protocole. Elles sont parfaites pour structurer ton code, le rendre plus clair et réutilisable. En maîtrisant les extensions, tu pourras tirer pleinement parti de la modularité et de la flexibilité offertes par Swift.

Note

En Swift, même les types natifs comme Int, String ou Array peuvent être étendus, ce qui te permet d’ajouter des fonctionnalités personnalisées à des types que tu utilises tous les jours. Par exemple, tu pourrais créer une méthode qui transforme un entier en emoji !