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

Structure

Programmation orientée objet (POO)

Dans ce cours, nous allons aborder une nouvelle notion très intéressante à manipuler et, surtout, importante à comprendre dans ton apprentissage de la programmation. Nous allons introduire ici la programmation orientée objet, souvent abrégée en POO.

La POO est une façon d’organiser ton code en créant des objets. Bien sûr, il ne s’agit pas d’objets du monde réel, mais d’objets virtuels, par exemple, un objet « voiture » à partir du code.

Chaque objet est défini par des propriétés. Par exemple, notre voiture possède une marque, une couleur, un type de véhicule, un nombre de portes, etc. Nos objets ont également des méthodes. Dans le cas de la voiture, on peut imaginer des méthodes pour démarrer le véhicule ou le faire freiner. La POO consiste à modéliser nos objets, comme nous avons modélisé notre voiture. Ensuite, une fois l’objet créé, je pourrai l’utiliser dans mon programme et même le faire interagir avec d’autres objets, si nécessaire.

Il existe plusieurs outils qui permettent de pratiquer la POO en Swift. Nous allons les découvrir au fur et à mesure de ton apprentissage sur Pixel-Swift. Pour commencer, nous allons nous attaquer aux structures.

Depuis le début, on utilise les types de base comme les Int, String, etc. Mais c’est assez limitant. Par exemple, je souhaite créer des données pour représenter les utilisateurs de mon application. Je définis donc de quelles données je vais avoir besoin.


let firstName: String
let lastName: String
var age: Int

J’ai créé les trois données qui me serviront à représenter mes utilisateurs dans l’application, à savoir firstName, lastName et age. Maintenant, je souhaite créer un utilisateur (Jean Code qui a 26 ans), et c’est là que je suis limité :


let firstName: String
let lastName: String
var age: Int

var jean = firstName + lastName + age

Problème : firstName et lastName sont de type String et age est de type Int. Je ne peux donc pas faire ça pour créer Jean. C’est là où la structure entre en jeu, elle va tout simplement me permettre de créer mon type sur mesure.

Les structures te permettent de créer des types de données sur mesure.


struct Person {
   let firstName: String
   let lastName: String
   var age : Int
}

var jean = Person(firsName: "jean", lastname: "Code", age 26)

J’ai créé une struct Person (les structures commencent par une majuscule, c’est une convention ⚠️ importante à respecter). Cette structure possède nos trois propriétés. Ensuite, j’ai créé Jean. Pour ca, j’ai fait ce qu’on appelle une instanciation de Person, et comme tu peux l’observer, j’ai simplement eu à donner les valeurs souhaitées à mes propriétés.

Tu viens de voir les bases d’utilisation d’une struct. Je te laisse consulter la suite du cours pour découvrir tous les outils proposés par les structures.

Syntaxe


struct NomDeLaStruct {
	
}

Une structure s’écrit avec le mot-clé struct. Par convention, on nomme toujours nos structs en commencent par une lettre majuscule NomDeLaStruct.

Propriété


struct Person{
   let firstName: String
   let lastName: String
   var age : Int
}

Une structure peut avoir ses propres variables et constantes, mais attention, dans la struct, on les appellera des propriétés. On parlera de la propriété firstName de la struct Person, par exemple.

Valeur par défaut


struct Person{
   let firstName: String
   let lastName: String
   var age : Int
   var numberOfLeg = 2
}

Les propriété peuvent posséder des valeurs par défaut.

Instance


var jean = Person(firstName: "Jean", lastname: "Code", age 26)
var mehdi = Person(firstName: "Mehdi", lastname: "Kahman", age 31)
var lucas = Person(firstName: "Lucas", lastname: "Social", age 19)
var julie = Person(firstName: "Julie", lastname: "Superposey", age 23)

Une instance, c’est un objet individuel généré à partir de notre structure. Comme tu peux l’observer ci-dessus, on a instancié quatre personnes à partir de la struct Person.

Méthode


struct Person{
  let firstName: String
  let lastName: String
  var age : Int
  var numberOfLeg = 2
  
  func sayHello(){
	  print("Salut je m'appelle \(firstName) ! ")
  }
}

Les structures peuvent contenir des fonctions, et ces fonctions peuvent utiliser les propriétés de la structure selon leurs besoins. Les fonctions à l’intérieur des structures sont appelées méthodes , mais elles utilisent toujours le même func mot-clé.

Accéder à des propriétés

 


struct Person{
  let firstName: String
  let lastName: String
  var age : Int
  var numberOfLeg = 2
}


var jean = Person(firstName: "jean", lastname: "Code", age 26)

print(jean.firstName)

// Lecture dans la console -> Jean

Une fois que tu as créé une instance d’une structure, tu peux lire ses propriétés en écrivant simplement le nom de l’instance, un point . , puis la propriété que tu souhaites lire.

Accéder à des méthodes


struct Person{
  let firstName: String
  let lastName: String
  var age : Int
  var numberOfLeg = 2
  
  func sayHello(){
	  print("Salut je m'appelle \(firsname) ! ")
  }
}


var jean = Person(firstName: "jean", lastname: "Code", age 26)

print(jean.sayHello)

// Lecture dans la console -> Salut je m'apelle Jean !

Pour accéder à une méthode il suffit d’utiliser un point . entre le nom de l’instance et le nom de la méthode.

Parcourir des données


struct Person{
  let firstName: String
  let lastName: String
  var age : Int
  var numberOfLeg = 2
}

var persons: [Person] = [
 Person(firstName: "Jean", lastname: "Code", age: 26),
 Person(firstName: "Mehdi", lastname: "Kahman", age: 31),
 Person(firstName: "Lucas", lastname: "Social", age: 19),
 Person(firstName: "Julie", lastname: "Superposey", age: 23),
]

for persons in person {
	print(person.firstName)
}

/* Lecture dans la console ->
Jean
Mehdi
Lucas
Julie
*/

Si tu as de nombreuses données, tu peux stocker tes instances dans un tableau, celui-ci sera du type de ta structure. Pour parcourir tes données, comme dans l’exemple, on va utiliser la boucle for in. Il te suffira ensuite de choisir les données que tu souhaites afficher en récupérant : index.propriété.

Mutabilité


struct Rectangle {
    var width: Double
    var height: Double

    mutating func resize(newWidth: Double, newHeight: Double) {
        width = newWidth
        height = newHeight
    }
}

Les structures sont immuables par défaut. Pour modifier une var propriété à l’intérieur d’une méthode, la méthode doit être marquée comme mutating. Si c’est une let propriété la valeur restera immuables quoi qu’il arrive.

Propriétés calculées

Une propriété calculée, c’est une valeur qui n’est pas directement stockée, mais qui est calculée à chaque fois que tu en as besoin. Elle utilise d’autres données ou propriétés pour toujours te donner une valeur à jour. Pas besoin de l’enregistrer quelque part, elle se met à jour toute seule en fonction du contexte.


struct Rectangle {
    var width: Double
    var height: Double
    
    var area: Double {
        return width * height
    }
}

Dans cet exemple, area est une propriété calculée. Elle ne stocke pas la surface, mais la calcule en multipliant la largeur width par la hauteur height.

Getter et Setter

Les propriétés calculées utilisent des getters et des setters pour lire et modifier leurs valeurs.

Getter

Le getter est une partie d’une propriété calculée qui récupère et renvoie une valeur. Pense-y comme à une fonction qui est appelée chaque fois que tu lis la propriété.


struct Rectangle {
    var width: Double
    var height: Double

    var area: Double {
        return width * height
    }
}

let rect = Rectangle(width: 10, height: 5)
print(rect.area) 

// Lecture dans la console -> 50.0

Ici, area utilise un getter pour calculer la surface chaque fois que nous accédons à cette propriété.

Setter

Le setter est une partie d’une propriété calculée qui permet de définir une nouvelle valeur pour cette propriété. Il permet de modifier d’autres propriétés en fonction de la nouvelle valeur.


struct Rectangle {
    var width: Double
    var height: Double

    var area: Double {
        get {
            return width * height
        }
        set {
            height = newValue / width
        }
    }
}

var rect = Rectangle(width: 10, height: 5)
rect.area = 100 
print(rect.height)  

// Lecture dans la console -> 10.0

Dans cet exemple, le setter de area permet de modifier la hauteur height en fonction de la nouvelle valeur de area, tout en gardant la largeur width constante.

 

A retenir :

  • Getter  Lit et renvoie une valeur calculée.
  • Setter  Modifie des propriétés basées sur une nouvelle valeur.

Exercices Pratiques

Le garage

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 structures te permettent de modéliser toutes sortes de données de manière simple et efficace. C’est un outil essentiel pour organiser ton code et représenter des modèles clairs. Maintenant, à toi de pratiquer pour bien assimiler leur fonctionnement.

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

Tu l’as vu, on écrit les structures avec une majuscule au début. Ce format d’écriture s’appelle le PascalCase, et c’est une convention importante à respecter. Pour résumer les conventions de nomination que nous avons vues : on utilise le camelCase pour les var, let et func, les collections sont au pluriel, leurs index au singulier lorsqu’on les parcourt, et les structures (ainsi que les classes, que l’on verra bientôt) en PascalCase.

L’importance de ces conventions commence à faire sens. Avec tous les outils différents que l’on a vus, elles permettent de rendre le code plus lisible et de repérer rapidement si l’on parle d’une variable, d’un tableau ou d’une structure. Ça rend ton code plus clair, non seulement pour toi, mais aussi pour ceux qui pourraient le lire ou travailler dessus avec toi.

Exercices Pratiques

Le garage

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 structures te permettent de modéliser toutes sortes de données de manière simple et efficace. C’est un outil essentiel pour organiser ton code et représenter des modèles clairs. Maintenant, à toi de pratiquer pour bien assimiler leur fonctionnement.

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

Tu l’as vu, on écrit les structures avec une majuscule au début. Ce format d’écriture s’appelle le PascalCase, et c’est une convention importante à respecter. Pour résumer les conventions de nomination que nous avons vues : on utilise le camelCase pour les var, let et func, les collections sont au pluriel, leurs index au singulier lorsqu’on les parcourt, et les structures (ainsi que les classes, que l’on verra bientôt) en PascalCase.

L’importance de ces conventions commence à faire sens. Avec tous les outils différents que l’on a vus, elles permettent de rendre le code plus lisible et de repérer rapidement si l’on parle d’une variable, d’un tableau ou d’une structure. Ça rend ton code plus clair, non seulement pour toi, mais aussi pour ceux qui pourraient le lire ou travailler dessus avec toi.