#La délégation

🧠 La délégation est souvent utilisée pour permettre à un objet (le déléguant) de communiquer avec un autre objet (le délégué) de manière décentralisée. UIKit, le framework d’interface utilisateur d’Apple, utilise largement le modèle de délégation pour gérer les interactions utilisateur.

#Exemple : UITableViewDelegate

Supposons que nous ayons une UITableView et que nous voulions réagir lorsque l’utilisateur sélectionne une cellule. Nous utiliserons le protocole UITableViewDelegate pour déléguer cette responsabilité à un autre objet.

import UIKit

class MyTableViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // Définir le délégué de la table view
        tableView.delegate = self
    }
}

extension MyTableViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // Réagir à la sélection d'une cellule
        print("Cell selected at section \(indexPath.section), row \(indexPath.row)")
    }
}
  • Dans cet exemple, MyTableViewController agit comme le délégué de la table view.
  • Lorsqu’une cellule est sélectionnée, la méthode tableView(_:didSelectRowAt:) est appelée sur le délégué, permettant à l’objet délégué (MyTableViewController dans ce cas) de réagir à cet événement.

#Utilisation de la délégation dans votre propre code

Vous pouvez également implémenter des délégués personnalisés dans votre propre code. Voici un exemple simple où une classe DataManager délègue la tâche de charger des données à une autre classe conformant au protocole DataManagerDelegate :

protocol DataManagerDelegate: AnyObject {
    func dataManagerDidFinishLoadingData(data: [String])
}

class DataManager {
    weak var delegate: DataManagerDelegate?

    func loadData() {
        // Code pour charger des données
        let loadedData = ["Item 1", "Item 2", "Item 3"]

        // Informer le délégué que les données ont été chargées
        delegate?.dataManagerDidFinishLoadingData(data: loadedData)
    }
}

class MyViewController: UIViewController, DataManagerDelegate {
    let dataManager = DataManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Définir le délégué de DataManager sur cette classe
        dataManager.delegate = self

        // Charger les données
        dataManager.loadData()
    }

    // Implémenter la méthode du délégué
    func dataManagerDidFinishLoadingData(data: [String]) {
        // Réagir lorsque les données sont chargées
        print("Data loaded: \(data)")
    }
}

Dans cet exemple, MyViewController agit comme le délégué de DataManager. Lorsque les données sont chargées, la méthode dataManagerDidFinishLoadingData(data:) est appelée sur le délégué, permettant à l’objet délégué (MyViewController dans ce cas) de réagir à cet événement.

La délégation est un modèle de conception puissant qui facilite la communication entre les objets dans une application Swift, favorisant la modularité et la réutilisation du code.