ProgrammationDéveloppeur iOS

Comment fonctionne le modèle de délégation en Swift ? Quels pièges rencontrent-on lors de la mise en œuvre des délégués, et quelles bonnes pratiques doivent être respectées ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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.

Mécanisme de fonctionnement

  1. Un protocole est défini, décrivant les signatures des méthodes du délégué.
  2. La classe conserve une référence weak à l'objet délégué, afin d'éviter les cycles de rétention.
  3. La classe appelle les méthodes du délégué lors de la survenue d'événements.

Exemple

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)") } }

Particularités et subtilités

  • Le délégué doit presque toujours être weak (ou unowned), afin d'éviter les cycles de rétention.
  • Le protocole du délégué est généralement hérité de AnyObject, pour permettre les références weak.
  • Lorsque cela est possible, utiliser des méthodes optionnelles dans le protocole via des extensions.

Question piège

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

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


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.