496 votes

L'utilisation de l'inférence @objc de Swift 3 en mode Swift 4 est dépréciée ?

En bref, en utilisant Xcode 9 Beta, j'ai rencontré l'avertissement suivant :

L'utilisation de l'inférence @objc de Swift 3 en mode Swift 4 est dépréciée. Veuillez tenir compte des avertissements relatifs à l'inférence @objc dépréciée, testez votre code avec la journalisation "Use of deprecated Swift 3 @objc inference" activée, et désactivez l'inférence @objc Swift 3.**

Après quelques recherches, je ne sais toujours pas comment résoudre ce problème. J'apprécierais grandement tout conseil sur la façon de résoudre ce problème ainsi qu'une explication de ce qui se passe.

Mon objectif est de mieux comprendre ce qui se passe avec mon code.

821voto

Evgeny Points 2765

Je me suis débarrassé de cet avertissement en changeant le paramètre de construction "Swift 3 @objc Inference" de mes cibles en "Default".

Disable Swift 3 @objc inference in Xcode9

De cet article :

Avant Swift 4, le compilateur faisait quelques Les déclarations Swift automatiquement disponibles en Objective-C . Par exemple, si l'on sous-classe NSObject, le compilateur crée des points d'entrée Objective-C pour toutes les méthodes de ces classes. Ce mécanisme s'appelle l'inférence @objc.

Dans Swift 4, cette inférence automatique @objc est dépréciée. car il est coûteux de générer tous ces points d'entrée en Objective-C. Lorsque le paramètre "Swift 3 @objc Inference" est réglé sur "On", l'ancien code peut fonctionner. Cependant, il affiche des avertissements de dépréciation qui doivent être pris en compte. Il est recommandé de " corriger " ces avertissements et de mettre le réglage sur "Default". qui est la valeur par défaut pour les nouveaux projets Swift.

Veuillez également vous référer à cette proposition Swift pour plus d'informations.

272voto

anon Points 108

- Qu'est-ce que @objc inférence ? Que se passe-t-il ?

Sur Swift 3 le compilateur déduit @objc dans un certain nombre d'endroits pour que vous n'ayez pas à le faire. En d'autres termes, il s'assure d'ajouter @objc pour vous !

Sur Swift 4 le compilateur ne le fait plus (autant). Vous devez maintenant ajouter @objc explicitement.

Par défaut, si vous avez un projet pré-Swift 4, vous recevrez des avertissements à ce sujet. Dans un projet Swift 4, vous obtiendrez des erreurs de construction. Ceci est contrôlé par l'option SWIFT_SWIFT3_OBJC_INFERENCE paramètre de construction. Dans un projet pré-Swift 4, ce paramètre est réglé sur On . Je recommande de régler cette valeur sur Default (ou Off ), qui est maintenant l'option par défaut sur un nouveau projet.

Il faudra un certain temps pour tout convertir, mais comme il s'agit de la version par défaut de Swift 4, cela vaut la peine de le faire.

- Comment arrêter les avertissements/erreurs du compilateur ?

Il y a deux façons de convertir votre code pour que le compilateur ne se plaigne pas.

La première consiste à utiliser @objc sur chaque fonction ou variable qui doit être exposée au runtime Objective-C :

@objc func foo() {

}

L'autre consiste à utiliser @objcMembers par un Class déclaration. Cela permet d'ajouter automatiquement @objc à TOUTES les fonctions et les variables de la classe. C'est la méthode la plus simple, mais elle a un coût. Par exemple, elle peut augmenter la taille de votre application en exposant des fonctions qui n'ont pas besoin d'être exposées.

@objcMembers class Test {

}

- Qu'est-ce que @objc et pourquoi est-ce nécessaire ?

Si vous introduisez de nouvelles méthodes ou variables dans une classe Swift, il faut les marquer en tant que @objc les expose au runtime Objective-C. C'est nécessaire lorsque du code Objective-C utilise votre classe Swift, ou si vous utilisez des fonctionnalités de type Objective-C telles que Selectors . Par exemple, le modèle cible-action : button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)

- Pourquoi je ne marquerais pas tout @objc ?

Il y a des points négatifs qui viennent avec le fait de marquer quelque chose comme @objc :

  • Augmentation de la taille du binaire de l'application
  • Pas de surcharge de fonctions

N'oubliez pas qu'il s'agit d'un résumé de très haut niveau et que la situation est plus complexe que ce que j'ai écrit. Je vous recommande de lire la proposition elle-même pour plus d'informations.

Sources :

49voto

Hassan Taleb Points 1235

Migrator ne peut pas identifier toutes les fonctions qui ont besoin de @objc Inferred Objectif-C les coups marqués comme déprécié pour vous aider à les trouver
- Avertissements de construction concernant les méthodes obsolètes
- Messages de la console lors de l'exécution de thunks dépréciés

enter image description here

12voto

Altaveron Points 3002

J'ai eu cet avertissement avec le paramètre "Swift 3 @objc Inference" = "Default". J'ai alors réalisé que ce paramètre était défini pour le projet et non pour la cible. Donc, assurez-vous que vous avez le paramètre "Default" dans votre cible pour vous débarrasser de cet avertissement.

8voto

ingconti Points 405

Vous pouvez simplement passer à "default" au lieu de "ON". Cela semble plus conforme à la logique d'Apple.

(mais tous les autres commentaires sur l'utilisation des @obj reste valable).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X