web-dev-qa-db-fra.com

Sélecteur vs Action Swift 4

Nouveau chez Swift. J'ai deux extraits ci-dessous:

NotificationCenter.default.addObserver(self, 
    selector:#selector(ViewController.notificationReceived), 
    name: Notification.Name(rawValue: name), object: nil)

@objc func notificationReceived(notification:Notification){
    let x = notification.userInfo!
    print("\(x["name"]!)")

}

et enfin

let x:UITapGestureRecognizer = UITapGestureRecognizer(target: self, 
    action: #selector(tapped))

self.addGestureRecognizer(x)

func tapped(){
    print("tapped")

    self.delegate!.theViewTapped()

}

Pourquoi est-ce pour le notificationCenter? Je suis censé fournir le @objc tag pour le paramètre selector mais pas pour le paramètre d'action UITapGestureRecognizer?

Quelle est exactement la différence entre Selector et Action in Rapide?

12
user2511882

Vérifiez cette proposition pour Swift 4: SE-0160 Limiter l'inférence @objc

Selon la description de la proposition, votre deuxième extrait de code a également besoin de @objc.

En fait, Swift 4 fourni avec Xcode 9 beta2 génère cette erreur pour la ligne utilisant #selector(tapped):

erreur: l'argument de '#selector' fait référence à la méthode d'instance 'tapped ()' qui n'est pas exposée à Objective-C

note: ajoutez '@objc' pour exposer cette méthode d'instance à Objective-C

Peut-être que votre deuxième est un peu trop ancien pour être utilisé avec Swift 4. Vous feriez mieux de penser toutes les méthodes invoquées via le sélecteur ont besoin de @objc attribut.

9
OOPer