Skip to main content

Alessandros's Blog - Build with freedom. Share with purpose

9 Juillet 2025 - Structures en Swift : créer ses propres types

Nouvelle journée dans mon apprentissage Swift ! Jour 33 de formation et 10ème jour des 100 Days of SwiftUI.

Excellente nuit, mes batteries internes sont chargées à 100% ! Paul Hudson avait raison : après les closures, tout semble plus facile… mais ce n’est pas vraiment le cas. Il y a encore des concepts à maîtriser qui sont propres à Swift.

# Première impression sur les structures

Au début, quand on découvre les structures (structs), on pense naturellement aux classes et objets d’autres langages. Mais plus on avance dans le cours, plus on comprend que les structs sont en réalité des types personnalisés - c’est là toute la subtilité de Swift.

# Apprentissages du jour : Les structures

## Créer ses propres structures

Une structure nous permet de regrouper des données liées et de leur donner des fonctionnalités. C’est comme créer notre propre type de données.

struct Album {
    let title: String
    let artist: String
    let year: Int
    
    func printSummary(){
        print("\(title) : \(artist) - \(year)")
    }
}
  • Convention importante : La première lettre doit être en majuscule
  • Les variables à l’intérieur sont appelées des propriétés
  • Les fonctions à l’intérieur sont appelées des méthodes

## Instances et initialiseurs

Quand on crée un objet à partir d’une structure, on parle d’instance. Swift génère automatiquement un initialiseur :

let red = Album(title: "Red", artist: "Taylor Swift", year: 2012)

Cette syntaxe ressemble à un appel de fonction - c’est ce qu’on appelle le “sugar syntax”. En réalité, Swift appelle une fonction init() dans la structure.

## Le mot-clé mutating

Si une méthode doit modifier les propriétés de la structure, elle doit être marquée comme mutating. Cela ne fonctionne qu’avec des variables (var), pas avec des constantes (let).

mutating func takeVacation(days: Int) {
    if vacationRemaining > days {
        vacationRemaining -= days
        print("Je pars en vacances")
    }
}

## Propriétés calculées

Les propriétés calculées sont des valeurs déterminées dynamiquement. Elles doivent toujours être déclarées avec var et avoir un type spécifié.

var vacationRemaining: Int {
    get {
        vacationAllocated - vacationTaken
    }
    
    set {
        vacationAllocated = vacationTaken + newValue
    }
}
  • newValue est un mot magique fourni par Swift pour les setters
  • On peut créer des propriétés en lecture seule en omettant le set

## Observateurs de propriétés

Les observateurs permettent d’exécuter du code quand une propriété change :

  • didSet : s’exécute après le changement
  • willSet : s’exécute avant le changement (plus rare)
var score = 0 {
    didSet {
        print("Score is now \(score)")
    }
}

Important : Éviter de mettre trop de logique dans les observateurs

## Initialiseurs personnalisés

On peut créer nos propres initialiseurs pour plus de flexibilité :

struct Player {
    let name: String
    let number: Int
    
    init(name: String) {
        self.name = name
        number = Int.random(in: 1...99)
    }
    
    init(number: Int) {
        name = "Anonymous"
        self.number = number
    }
}
  • Pas de mot-clé func
  • self est utilisé pour distinguer les propriétés des paramètres
  • Toutes les propriétés doivent être initialisées

Note : Dès qu’on crée un initialiseur personnalisé, l’initialiseur par défaut disparaît. Pour le conserver, il faut le placer dans une extension.

## Différence fonction vs méthode

  • Fonction : indépendante, pas liée à un type
  • Méthode : liée à une structure ou classe

# Réflexions

Cette approche des structures me rappelle un peu les classes d’autres langages, mais avec une philosophie différente. Swift privilégie les structures pour la plupart des cas d’usage.

Le fait de pouvoir créer des propriétés calculées et des observateurs directement dans la structure est vraiment puissant. Ça permet de garder la logique au bon endroit.

# Avancement projets portfolio

J’ai également fini rapidement les préparations pour le projet 2 du portfolio et je prépare déjà le matériel pour la troisième application. Cette approche d’anticipation me permet de garder une longueur d’avance et d’éviter les retards quand viendra le moment du développement.

À demain !

Alessandro