Modèles de conception en Swift : guide pratique pour les développeurs iOS/macOS
Les modèles de conception (design patterns) sont des solutions éprouvées pour les problèmes typiques du développement logiciel. Pour les développeurs iOS/macOS, la connaissance des modèles en Swift est une compétence essentielle qui permet de créer des applications évolutives, testables et maintenables. Dans cet article, nous allons analyser 4 modèles clés avec des exemples de code réels.
1. Singleton (Singleton)
L'un des modèles les plus populaires dans le développement iOS. Il garantit qu'une classe n'a qu'une seule instance et fournit un point d'accès global à celle-ci. Il est utilisé pour gérer les ressources partagées : UserDefaults, NetworkManager, Database.
Implémentation du Singleton en Swift
class NetworkManager { static let shared = NetworkManager() private init() { } func fetchData(from url: URL) { // logique de la requête print("Données reçues de \\(url)") }}
// UtilisationNetworkManager.shared.fetchData(from: URL(string: "https://api.example.com")!)Important : Dans Swift 5.5+, utilisez actor pour la sécurité des threads :
actor SettingsManager { static let shared = SettingsManager() private var settings: [String: String] = [:] func setValue(_ value: String, forKey key: String) { settings[key] = value } func getValue(forKey key: String) -> String? { return settings[key] }}2. Factory Method (Méthode de fabrique)
Définit une interface pour créer des objets, mais permet aux sous-classes de modifier le type des objets créés. Idéal pour créer différents types de composants d'interface utilisateur ou de modèles de données.
Exemple : création de boutons pour différentes plateformes
protocol Button { func render()}
class iOSButton: Button { func render() { print("Affichage du bouton iOS aux coins arrondis") }}
class macOSButton: Button { func render() { print("Affichage du bouton macOS avec dégradé") }}
protocol ButtonFactory { func createButton() -> Button}
class iOSButtonFactory: ButtonFactory { func createButton() -> Button { return iOSButton() }}
class macOSButtonFactory: ButtonFactory { func createButton() -> Button { return macOSButton() }}
// Utilisationlet factory: ButtonFactory = iOSButtonFactory()let button = factory.createButton()button.render() // "Affichage du bouton iOS aux coins arrondis"3. Observer (Observateur)
Permet aux objets de s'abonner à des événements et de recevoir des notifications de changements. En Swift, il est implémenté via NotificationCenter, Combine ou didSet.
Implémentation via Combine (iOS 13+)
import Combine
class WeatherStation { @Published var temperature: Double = 0.0 func updateTemperature(_ temp: Double) { temperature = temp }}
class WeatherDisplay { var subscriptions = Set<AnyCancellable>() let station = WeatherStation() func startObserving() { station.$temperature .sink { [weak self] newTemp in print("Température modifiée : \\(newTemp)°C") self?.updateUI(with: newTemp) } .store(in: &subscriptions) } private func updateUI(with temp: Double) { // Mise à jour de l'interface }}Implémentation classique via protocole
protocol Observer: AnyObject { func update(value: Int)}
class Subject { private var observers = [Observer]() func attach(_ observer: Observer) { observers.append(observer) } func detach(_ observer: Observer) { observers.removeAll { $0 === obs
```