@selector() en Swift : Guide complet pour la compatibilité ObjC

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Qu'est-ce que @selector() en Swift et pourquoi en a-t-on besoin ?



Si vous avez déjà travaillé avec Objective-C ou rencontré du code hérité, vous avez sûrement entendu parler de la construction magique @selector(). En Swift, elle s'est transformée en #selector, mais l'essence reste la même : c'est un pont entre le typage statique de Swift et la nature dynamique de l'Objective-C runtime.



Imaginez que vous deviez passer une référence à une méthode en tant qu'argument. Par exemple, pour gérer un clic sur un bouton ou vous abonner à des notifications. En Swift, nous avons l'habitude d'utiliser des closures, mais les bibliothèques Apple (UIKit, AppKit, Foundation) reposent toujours sur le bon vieux mécanisme des sélecteurs. C'est là que @selector() en Swift devient un outil indispensable.



Dans ce tutoriel, nous aborderons :

  • Comment déclarer correctement les sélecteurs en Swift moderne
  • Les erreurs typiques et comment les éviter
  • Des exemples concrets issus du développement iOS
  • Quand utiliser #selector et quand privilégier des alternatives


De @selector() à #selector : l'évolution de la syntaxe



En Objective-C, un sélecteur ressemble à ceci :

[@selector(buttonTapped:)]


En Swift 2.0, la construction #selector est apparue et est devenue la norme. Voici à quoi cela ressemble maintenant :

#selector(MyClass.buttonTapped(_:))


La différence clé : #selector en Swift est vérifié par le compilateur. Si vous faites une faute de frappe dans le nom de la méthode ou passez une signature incorrecte, le compilateur générera une erreur. C'est un énorme avantage par rapport à Objective-C, où un sélecteur n'est qu'une chaîne de caractères et où l'erreur n'apparaît qu'à l'exécution.



Règles de déclaration des méthodes pour #selector



La méthode que vous passez à #selector doit être :

  • Accessible depuis Objective-C — marquée avec l'attribut @objc
  • Non privée (ou marquée comme @objc private)
  • Compatible en signature avec ce que la partie appelante attend


Exemple de déclaration correcte :

class ViewController: UIViewController {    @objc func buttonTapped(_ sender: UIButton) {        print("Bouton pressé !")    }        override func viewDidLoad() {        super.viewDidLoad()        let button = UIButton(type: .system)        button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)    }}


Notez le @objc avant la méthode. Sans lui, le compilateur ne vous permettra pas d'utiliser #selector.



@selector() Swift : exemples pratiques



1. Target-Action : boutons et gestes



Le scénario d'utilisation le plus fréquent de #selector est la liaison d'actions aux éléments d'interface utilisateur :



class ProfileViewController: UIViewController {        @objc private func avatarTapped(_ gesture: UITapGestureRecognizer) {        print("Avatar pressé")    }        @objc private func settingsButtonPressed() {        print("Ouvrir les paramètres")    }        override func viewDidLoad() {        super.viewDidLoad()                // Geste        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(avatarTapped(_:)))        avatarImageView.addGestureRecognizer(tapGesture)                // Bouton        settingsButton.addTarget(self, action: #selector(settingsButtonPressed), for: .touchUpInside)    }}


Rappelez-vous : si la méthode accepte un paramètre (par exemple, UITapGestureRecognizer), vous devez indiquer _ dans la signature du sélecteur : #selector(avatarTapped(_:)).



2. PerformSelector et appels différés



Il est parfois nécessaire d'appeler une méthode dynamiquement, notamment avec KVO ou les minuteurs :



class TimerManager {    @objc func fireTimer() {                

Blogs

Book Recommendations