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?
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.