0Pricing
Swift Academy · Leçon

Alternatives au modèle observateur

Comparez-le aux délégués et aux éditeurs Combine.

Alternatives au modèle observateur est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Swift Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Swift Academy comprend 4 leçons au total.

Alternatives au modèle observateur

NotificationCenter est une façon de réagir aux événements. Swift en propose d'autres : la délégation, Combine et les flux asynchrones. Chacune convient à une forme différente de communication.

Le modèle observateur

Le modèle observateur permet aux objets de s'abonner aux événements d'un sujet. NotificationCenter en est une implémentation globale et faiblement couplée.

import Foundation

// Subject posts, observers react, neither holds the other.
NotificationCenter.default.post(name: Notification.Name("tick"), object: nil)
print("Broadcast an event")

Délégation

Un delegate établit un lien un-à-un : un objet transmet des événements précis à un seul delegate par l'intermédiaire d'un protocole. Cette approche est explicite et sûre du point de vue des types.

protocol DownloadDelegate: AnyObject {
    func didFinish(_ bytes: Int)
}
class Downloader {
    weak var delegate: DownloadDelegate?
    func finish() { delegate?.didFinish(1024) }
}
print("Delegate is one-to-one and typed")

Délégué ou notification

Utilisez un delegate lorsqu'un seul objet est concerné et que la relation est claire. Utilisez NotificationCenter lorsque plusieurs observateurs inconnus sont susceptibles de réagir.

import Foundation

// One listener -> delegate. Many/unknown listeners -> NotificationCenter.
print("Cardinality guides the choice")

Éditeurs Combine

Combine modélise les événements sous forme d'éditeurs auxquels vous vous abonnez avec sink, et prend en charge des opérateurs de transformation comme map et filter.

import Combine

let subject = PassthroughSubject<Int, Never>()
let c = subject.sink { print("Got \($0)") }
subject.send(5)
_ = c

Éditeur NotificationCenter

Combine fait le lien avec NotificationCenter : publisher(for:) transforme les notifications en un flux que vous pouvez transformer.

import Foundation
import Combine

let name = Notification.Name("ping")
let c = NotificationCenter.default.publisher(for: name)
    .sink { _ in print("Combine got notification") }
NotificationCenter.default.post(name: name, object: nil)
_ = c

Opérateurs de Combine

La force de Combine réside dans la composition de pipelines d'événements : filtrer, temporiser, combiner et transformer les valeurs de manière déclarative.

import Combine

let subject = PassthroughSubject<Int, Never>()
let c = subject
    .filter { $0 > 0 }
    .map { $0 * 2 }
    .sink { print($0) }
subject.send(-1)
subject.send(3)
_ = c

Séquences asynchrones

Le Swift moderne propose AsyncStream et des séquences asynchrones de notifications, ce qui vous permet de consommer les événements avec for await dans le cadre de la concurrence structurée.

import Foundation

func listen() async {
    let name = Notification.Name("ping")
    for await _ in NotificationCenter.default.notifications(named: name) {
        print("Async observed")
        break
    }
}
print("Can await notifications")

Fermetures et fonctions de rappel

Pour un rappel unique et local, une fermeture stockée est la solution la plus simple, sans aucun mécanisme d'observation.

struct Button {
    var onTap: () -> Void
    func tap() { onTap() }
}
Button(onTap: { print("tapped") }).tap()

Choisir une approche

Delegate : un-à-un, explicite. NotificationCenter : plusieurs-à-plusieurs, dissocié. Combine et l'asynchrone : flux nécessitant des transformations. Fermeture : rappels locaux simples.

import Foundation

// Match the tool to the communication shape.
print("Delegate, Notification, Combine, async, closure")

Compromis

NotificationCenter est flexible, mais non typé et facile à laisser fuir. La délégation et Combine sont sûrs du point de vue des types ; Combine et l'asynchrone offrent davantage de possibilités au prix de concepts supplémentaires.

import Foundation

// Prefer typed approaches when the relationship is known.
print("Type safety vs flexibility tradeoff")

Vérification rapide

Quel mécanisme convient le mieux à une relation claire, un-à-un et sûre du point de vue des types ?

Récapitulatif

Le modèle observateur possède plusieurs formes en Swift : NotificationCenter pour les événements dissociés de plusieurs émetteurs à plusieurs destinataires, la délégation pour les liens typés un-à-un, Combine et les séquences asynchrones pour les flux composables, et les fermetures pour les rappels simples. Choisissez en fonction de la forme de communication et des besoins en matière de sûreté des types. Le cours est maintenant terminé.

Questions Fréquemment Posées

La leçon « Alternatives au modèle observateur » est-elle gratuite ?

Oui — le texte complet de « Alternatives au modèle observateur » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Swift Academy, passe à CoddyKit PRO. Le cours Swift Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Alternatives au modèle observateur » ?

Comparez-le aux délégués et aux éditeurs Combine. Tu pratiques Swift Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Swift Academy ?

Aucune expérience préalable n'est requise. Swift Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Alternatives au modèle observateur » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Swift Academy ?

Oui. Chaque leçon Swift Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Publier et observer des notifications
  2. Charges utiles userInfo des notifications
  3. Supprimer les observateurs en toute sécurité
  4. Alternatives au modèle observateur
← Retour à Swift Academy