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)
_ = cOpé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)
_ = cSé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
- Publier et observer des notifications
- Charges utiles userInfo des notifications
- Supprimer les observateurs en toute sécurité
- Alternatives au modèle observateur