Le modèle de délégation (delegation) est l'un des modèles clés dans l'écosystème Swift, largement utilisé pour transférer la responsabilité du traitement des événements entre les objets. La délégation permet à une classe de déléguer une partie de son comportement à un autre objet (délégué), généralement défini par un protocole.
protocol DataUpdateDelegate: AnyObject { func didUpdateData(_ data: String) } class DataProvider { weak var delegate: DataUpdateDelegate? func updateData() { // ... logique de mise à jour des données delegate?.didUpdateData("Nouvelles données") } } class ViewController: UIViewController, DataUpdateDelegate { func didUpdateData(_ data: String) { print("Les données ont été mises à jour : \(data)") } }
weak (ou unowned), afin d'éviter les cycles de rétention.AnyObject, pour permettre les références weak.Comment implémentez-vous la délégation si votre délégué est un type valeur (par exemple, struct) ?
Réponse :
En Swift, les délégués doivent être des types de référence (class ou AnyObject), car seules les références de type référence peuvent être weak. Un struct ou un enum ne peut pas servir de délégué, sinon des problèmes surviennent : le compilateur n'autorisera pas l'utilisation de la propriété weak, et une référence forte entraînera un cycle de rétention.
// Erreur ! On ne peut pas déclarer un délégué comme struct : le compilateur n'autorisera pas de le rendre weak protocol StructDelegate { ... } struct MyStructDelegate: StructDelegate { ... } weak var delegate: StructDelegate? // Erreur
Histoire
Dans un projet, ils ont oublié de marquer la propriété déléguée comme weak. En conséquence, un cycle de rétention s'est formé entre la vue et le délégué, entraînant une augmentation progressive de la mémoire et un plantage au bout de trente minutes de fonctionnement.
Histoire
Le délégué a été implémenté via un type valeur (struct), au lieu d'une classe. L'IBOutlet, qui aurait dû devenir le délégué, ne recevait pas de notifications — aucune liaison ne se produisait. Le problème n'a été découvert qu'après l'analyse des journaux et le débogage.
Histoire
Dans un projet, le protocole du délégué n'a pas hérité de AnyObject, et la propriété du délégué a été déclarée comme weak var. Cela a conduit à une erreur de compilation que l'équipe a mis du temps à comprendre et à corriger.