web-dev-qa-db-fra.com

Comment puis-je gérer la désapprobation de l'inférence @objc avec #selector () dans Swift 4?

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:

119
LinusGeffarth

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'étiquette getter: ou setter:, tel que #selector(getter: MyViewController.myButton).

15
Kiran Sarvaiya

À 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)
}
8
Logan Sease

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: 

  1. Allez à Build Settings
  2. Rechercher le mot clé @objc
  3. Définissez la valeur de Swift 3 @objc interface sur Off

ci-dessous est la capture d'écran qui illustre les étapes mentionnées ci-dessus: 

 Silencing the warning "Swift 3 @objc interface"

J'espère que cela t'aides

1
S1LENT WARRIOR

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.

1
Renjish C