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

Classe

Une classe est un modèle pour créer des objets. Les classes définissent des propriétés et des méthodes. Les propriétés stockent des valeurs, tandis que les méthodes définissent le comportement des objets créés à partir de la classe.

Mais alors, c’est quoi la différence avec une struct ?

Effectivement, tu vas le voir, les classes et les structs sont très similaires. À quelques détails près

Il n’y a pas d’initialiseur automatique d’instance avec les classes.

Une classe peut hériter d’une autre.

Les classes sont des types de référence, les structs des types de valeur.

On va décortiquer ces différences en détail dans le cours.

 Syntaxe


class Car {
   var color: String
   var brand: String
   var horse: Int   

  init(color: String, brand: String, horse: Int) {
    self.color = color
    self.brand = brand
    self.horse = horse
  }
}

Comme tu peux l’observer, on vient de créer une classe Car avec trois propriétés. À la différence des structures qui ont un initialisateur automatique, avec les classes, il va falloir initialiser manuellement. Pour ça, on utilise init(), une méthode spéciale qui aide à créer un nouvel objet, en lui donnant les valeurs initiales dont il a besoin pour bien fonctionner.

On découvre également le mot-clé self. Ce mot permet à un objet de parler de lui-même. Il est utilisé par un objet pour se référer à ses propres propriétés ou méthodes. Dans notre exemple, self.color = color signifie que la propriété color, qui fait référence à la propriété color de la classe, sera égale à la valeur du paramètre color de l’init.

 

Héritage

Super-classe


class Vehicule {
   var speed: Int  

   init(speed: Int) {
      self.speed = speed
   }
   func start() { 
      print("Le véhicule démarre à \(speed) km/h.") 
   } 

   func stop() { 
      print("Le véhicule s'arrête.") 
   } 
}

Sous-classe


class Car: Vehicule {
   var color: String  

   init(speed: Int, color: String) {
      self.color = color
      super.init(speed: speed)
   }
}

L’héritage permet à une classe d’hériter des propriétés et méthodes d’une autre classe. La classe héritée est appelée « classe parente » ou « superclasse », et la classe héritante est appelée « classe dérivée » ou « sous-classe ». Dans la sous-classe, on utilise super.init() pour faire appel à l’initialiseur de la classe parente


class Car: Vehicule {
   var color: String  

   init(speed: Int, color: String) {
      self.color = color
      super.init(speed: speed)
   }
}

let myCar = Car(speed: 100, color: "Rouge")

myCar.start()

On peut appeler les méthodes et propriétés de la super-classe parente. Ici la méthode start().


Override


class Car: Vehicule {
   var color: String  

   init(speed: Int, color: String) {
      self.color = color
      super.init(vitesse: vitesse)
   }

  override func start() {
    print("La voiture \(color) démarre à \(vitesse) km/h.")
  }
}

var fordMustang = Car(speed: 123, color: "Jaune")
print(fordMustang.start())

Lecture dans la console ->
Le véhicule Jaune démarre à 123 km/h.

Le mot-clé override permet à une méthode dans une sous-classe de fournir une version personnalisée d’une méthode qui est déjà définie dans sa super-classe.

 Encapsulation

L’encapsulation est un concept fondamental de la programmation orientée objet qui consiste à regrouper les données (propriétés) et les méthodes (fonctions) qui manipulent ces données au sein d’une même unité, souvent une classe, tout en restreignant l’accès direct à certaines de ces données. Cela permet de protéger l’intégrité des données et de contrôler leur accès et leur modification.

Il existe plusieurs modificateurs d’accès en Swift, mais nous allons nous concentrer sur les deux principaux à retenir pour le moment

public : Les membres sont accessibles depuis n’importe quel fichier source de tout module qui importe le module de définition.

private : Les membres sont accessibles uniquement au sein de la même déclaration.

Setters et Getters

Les setters et getters sont des méthodes utilisées pour contrôler l’accès et la modification des propriétés d’une classe ou d’une structure. Ils jouent un rôle essentiel dans l’encapsulation en permettant un contrôle sur la manière dont les données sont lues et modifiées.


class Bank {
   private var money: Int = 0 
 
   func getMoney() -> Int {
      return money
   }

   func setMoney(amount: Int) {
      if amount  >= 0 {
         money = amount
      } else {
         print(“Le montant ne peut pas être négatif.“)
      }
   }
}
Dans notre exemple d’encapsulation, la propriété money est privée private, ce qui signifie que l’on ne peut pas accéder directement à cette valeur depuis l’extérieur de la classe. On utilise donc la méthode getMoney(), qui est une méthode getter, pour retourner la valeur de la propriété money. C’est grâce à cette méthode que l’on peut consulter money en dehors de la classe Bank. Ensuite, si je souhaite définir une valeur à la propriété money depuis l’extérieur de la classe, encore une fois, comme cette propriété est privée, je ne peux pas le faire directement. C’est là qu’intervient la méthode setter setMoney(), qui permet de définir une nouvelle valeur en dehors de la classe.

 Classe VS Structure

Classe Type de référence

Structure Type de valeur

Struct Type de valeur :

Les struct sont des types de valeur. Cela signifie que lorsqu’une structure est affectée à une nouvelle variable ou constante, ou passée à une fonction, une copie de la structure est créée. Chaque instance de la structure est indépendante des autres.


struct Person {
    var name: String
}

var person1 = Person(name: "Steve")
var person2 = person1
person2.name = "Tim"

print(person1.name)  
print(person2.name)  

/* Lecture dans la console ->
Steve
Tim
*/

Classe → Type de référence

Les classes sont des types de référence. Lorsqu’une instance de classe est affectée à une nouvelle variable ou constante, ou passée à une fonction, une référence à la même instance est créée. Toutes les références pointent vers la même instance.


class Person {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

let person1 = Person(name: "Steve")
let person2 = person1
person2.name = "Tim"

print(person1.name)  
print(person2.name)  

/* Lecture dans la console ->
Tim
Tim
*/

Comment choisir entre une classe ou une structure 

Pour choisir entre une structure et une classe, il est important de comprendre leurs différences fondamentales et d’évaluer tes besoins spécifiques. Opte pour une structure si tu souhaites que chaque instance soit une copie indépendante, si tu travailles principalement avec des données immuables, si les données sont relativement simples et de petite taille, et si tu n’as pas d’héritage.

En revanche, choisis une classe si tu as besoin de partager et modifier les mêmes données entre différentes parties de ton code, si tu as besoin d’héritage, si tu gères des états complexes ou des cycles de vie d’objets complexes, ou si tu as besoin de personnaliser la gestion de la mémoire. En te basant sur ces critères, tu peux déterminer si une classe ou une structure convient le mieux à tes besoins spécifiques en Swift.

Exercices Pratiques

Exo classe

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 classes en Swift sont l’un des piliers fondamentaux de la programmation orientée objet. Elles te permettent de modéliser des objets complexes avec des propriétés et des comportements. Comprendre les classes te donnera les outils nécessaires pour structurer ton code, organiser tes données, et réutiliser les fonctionnalités à travers ton application. Avec les classes, tu pourras gérer efficacement des relations entre objets, créer des hiérarchies, et rendre ton code plus évolutif et maintenable.

Quiz

Après un peu de pratique, il est temps de te tester avec un petit quiz pour vérifier si tout est clair pour toi. Prends ton temps, lis bien les questions, et bonne chance.

Note

Attention ! Les classes se nomment comme les structures : en PascalCase. Ça signifie que tu les nommeras toujours en commençant par une majuscule !

Exercices Pratiques

Exo classe

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 classes en Swift sont l’un des piliers fondamentaux de la programmation orientée objet. Elles te permettent de modéliser des objets complexes avec des propriétés et des comportements. Comprendre les classes te donnera les outils nécessaires pour structurer ton code, organiser tes données, et réutiliser les fonctionnalités à travers ton application. Avec les classes, tu pourras gérer efficacement des relations entre objets, créer des hiérarchies, et rendre ton code plus évolutif et maintenable.

Quiz

Après un peu de pratique, il est temps de te tester avec un petit quiz pour vérifier si tout est clair pour toi. Prends ton temps, lis bien les questions, et bonne chance.

Note

Attention ! Les classes se nomment comme les structures : en PascalCase. Ça signifie que tu les nommeras toujours en commençant par une majuscule !