Comment puis-je composer avec @objc inférence autodérision avec #sélecteur() dans Swift 4?

Je suis en train de convertir mon projet est le code source de Swift 3 à Swift 4. Un avertissement Xcode me donne de l'est à propos de ma sélecteurs.

Par exemple, j'ai ajouter une cible à un bouton utilisant un sélecteur comme ceci:

button.addTarget(self, action: #selector(self.myAction), for: .touchUpInside)

C'est l'avertissement qu'il montre:

Argument de '#sélecteur " se réfère à la méthode d'instance 'myAction () "dans" ViewController " qui dépend de la '@objc " attribut inférence obsolète dans Swift 4

Ajouter "@objc " pour exposer cette méthode d'instance d'Objective-C

Maintenant, frapper Fix sur le message d'erreur ne ce de ma fonction:

//before
func myAction() { /* ... */ }

//after
@objc func myAction() { /* ... */ }

Je n'ai pas vraiment envie de le renommer tous mes fonctions à inclure la @objc marque et je suppose que ce n'est pas nécessaire.

Comment dois-je réécrire le sélecteur pour faire face à la désapprobation?


Liés à la question:

  • Nope, en les marquant comme @objc est maintenant nécessaire afin de les exposer à l'Obj-C, et donc de l'utiliser avec des sélecteurs.
  • Ainsi, le obsolète partie est de déduire d'accès public fonctionne comme @objc? C'est un peu gênant, mais je général de rendre ces fonctions privé, m'oblige à le marquer comme @objc de toute façon.
  • Voir SE-0160 pour plus d'informations sur le changement. Une autre alternative est de marquage de votre classe donnée comme @objcMembers afin d'exposer tous les Obj-C compatible membres de l'Obj-C, mais je ne le conseille pas, à moins que vous vraiment besoin de votre ensemble de la classe à être exposé.
  • Quelle serait la conséquence de cela, @Hamish? Il semble plus pratique de mettre l'ensemble de la classe à @objc que de le faire que pour chaque fonction individuelle.
  • Comme dit dans la proposition, il serait susceptible d'augmenter inutilement la taille de votre binaire et la liaison dynamique prendrait plus de temps. Je ne pense vraiment pas que c'est trop de tracas pour la clarté que vous avez spécifiquement moyenne pour une chose en particulier à être utilisé à partir de l'Obj-C.
  • Alors, enveloppant: seule solution serait de marquer chaque fonction (exigeant) avec @objc. Si oui, poste que comme une réponse et je vais l'accepter. @Hamish. Merci pour votre aide!
  • essayez cette #selector(ViewController.myAction)
  • Essayé, pas de travail.
  • Question connexe, qui arrive à la base: stackoverflow.com/questions/44379348/...