J'essaie de convertir le code source de mon projet de Swift 3 à Swift 4. Un avertissement que Xcode m'annonce concerne mes sélecteurs.
Par exemple, j'ajoute une cible à un bouton en utilisant un sélecteur standard comme celui-ci:
button.addTarget(self, action: #selector(self.myAction), for: .touchUpInside)
C'est l'avertissement qu'il montre:
L'argument '#selector' fait référence à la méthode d'instance 'myAction ()' dans 'ViewController' qui dépend de l'inférence d'attribut '@objc' déconseillée dans Swift 4
Ajoutez '@objc' pour exposer cette méthode d'instance à Objective-C
Maintenant, frapper Fix
sur le message d'erreur fait ceci à ma fonction:
// before
func myAction() { /* ... */ }
// after
@objc func myAction() { /* ... */ }
Je ne veux pas vraiment renommer toutes mes fonctions pour inclure la marque @objc
et je suppose que ce n'est pas nécessaire.
Comment réécrire le sélecteur pour gérer la désapprobation?
Question connexe:
As Documentation officielle Apple . vous devez utiliser @objc pour appeler votre méthode de sélection.
En Objective-C, un sélecteur est un type qui fait référence au nom d'un Méthode Objective-C. Dans Swift, les sélecteurs Objective-C sont représentés par la structure
Selector
et peut être construite à l'aide du#selector
expression. Pour créer un sélecteur pour une méthode pouvant être appelée à partir de Objective-C, transmettez le nom de la méthode, tel que#selector(MyViewController.tappedButton(sender:))
. Pour construire un sélecteur pour la méthode de lecture ou de définition Objective-C d’une propriété, transmettez le nom de la propriété préfixé par l'étiquettegetter:
ousetter:
, tel que#selector(getter: MyViewController.myButton)
.
À partir de, je pense que Swift 4.2, tout ce que vous avez à faire est d’affecter @IBAction à votre méthode et vous pouvez éviter cette idiote annotation @objc
`` `
let tap = UITapGestureRecognizer(target: self, action: #selector(self.cancel))
@IBAction func cancel()
{
self.dismiss(animated: true, completion: nil)
}
Comme déjà mentionné dans d'autres réponses, il n'y a aucun moyen d'éviter l'annotation @objc
pour les sélecteurs.
Mais l’avertissement mentionné dans le PO peut être réduit au silence en prenant les mesures suivantes:
Off
ci-dessous est la capture d'écran qui illustre les étapes mentionnées ci-dessus:
J'espère que cela t'aides
Si vous avez besoin de membres Objective C dans votre contrôleur de vue, ajoutez simplement@objcMembersen haut du contrôleur de vue. Et vous pouvez éviter cela en ajoutant IBAction dans votre code.
`@IBAction func buttonAction () {
} `
Assurez-vous de connecter cette prise dans le storyboard.