@selector() in Swift: Vollständiger Leitfaden für ObjC-Kompatibilität

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was ist @selector() in Swift und wozu wird es benötigt?



Wenn Sie jemals mit Objective-C gearbeitet oder mit veraltetem Code zu tun hatten, haben Sie sicherlich von der magischen Konstruktion @selector() gehört. In Swift wurde sie zu #selector transformiert, aber das Wesen ist gleich geblieben: Es ist die Brücke zwischen der statischen Typisierung von Swift und der dynamischen Natur der Objective-C-Laufzeitumgebung.



Stellen Sie sich vor, Sie müssen eine Referenz auf eine Methode als Argument übergeben. Zum Beispiel für die Verarbeitung eines Tastendrucks oder das Abonnieren von Benachrichtigungen. In Swift sind wir es gewohnt, Closures zu verwenden, aber die Apple-Bibliotheken (UIKit, AppKit, Foundation) verlassen sich immer noch auf den guten alten Mechanismus der Selektoren. Genau hier wird @selector() in Swift zu einem unverzichtbaren Werkzeug.



In diesem Leitfaden behandeln wir:

  • Wie man Selektoren im modernen Swift korrekt deklariert
  • Typische Fehler und wie man sie vermeidet
  • Reale Beispiele aus der iOS-Entwicklung
  • Wann man #selector verwenden sollte und wann Alternativen


Von @selector() zu #selector: Die Evolution der Syntax



In Objective-C sieht ein Selektor so aus:

[@selector(buttonTapped:)]


In Swift 2.0 erschien die Konstruktion #selector, die zum Standard wurde. So sieht das jetzt aus:

#selector(MyClass.buttonTapped(_:))


Der wesentliche Unterschied: #selector in Swift wird vom Compiler überprüft. Wenn Sie sich im Methodennamen vertippen oder eine falsche Signatur übergeben, gibt der Compiler einen Fehler aus. Das ist ein großer Vorteil gegenüber Objective-C, wo ein Selektor nur ein String ist und der Fehler erst zur Laufzeit auftritt.



Regeln für die Deklaration von Methoden für #selector



Die Methode, die Sie an #selector übergeben, muss:

  • Von Objective-C aus zugänglich sein – mit dem Attribut @objc gekennzeichnet
  • Nicht privat sein (oder als @objc private gekennzeichnet)
  • In der Signatur kompatibel mit dem sein, was die aufrufende Seite erwartet


Beispiel einer korrekten Deklaration:

class ViewController: UIViewController {    @objc func buttonTapped(_ sender: UIButton) {        print("Schaltfläche gedrückt!")    }        override func viewDidLoad() {        super.viewDidLoad()        let button = UIButton(type: .system)        button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)    }}


Beachten Sie das @objc vor der Methode. Ohne dieses erlaubt der Compiler die Verwendung von #selector nicht.



@selector() Swift: Praktische Beispiele



1. Target-Action: Schaltflächen und Gesten



Das häufigste Szenario für die Verwendung von #selector ist die Bindung von Aktionen an UI-Elemente:



class ProfileViewController: UIViewController {        @objc private func avatarTapped(_ gesture: UITapGestureRecognizer) {        print("Avatar gedrückt")    }        @objc private func settingsButtonPressed() {        print("Einstellungen öffnen")    }        override func viewDidLoad() {        super.viewDidLoad()                // Geste        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(avatarTapped(_:)))        avatarImageView.addGestureRecognizer(tapGesture)                // Schaltfläche        settingsButton.addTarget(self, action: #selector(settingsButtonPressed), for: .touchUpInside)    }}


Denken Sie daran: Wenn die Methode einen Parameter akzeptiert (z. B. UITapGestureRecognizer), müssen Sie _ in der Selektorsignatur angeben: #selector(avatarTapped(_:)).



2. PerformSelector und verzögerte Aufrufe



Manchmal muss eine Methode dynamisch aufgerufen werden, insbesondere bei der Arbeit mit KVO oder Timern:



class TimerManager {    @objc func fireTimer() {                

Blogs

Buchempfehlungen