En bref, lors de l'utilisation de Xcode 9 Beta, j'ai rencontré l'avertissement suivant:
L'utilisation de l'inférence Swift 3 @objc en mode Swift 4 est déconseillée. Veuillez adresser les avertissements d'inférence @objc obsolètes, testez votre code avec la journalisation «Utilisation de l'inférence Swift 3 @objc obsolète» activée et désactivez l'inférence Swift 3 @objc. **
Après quelques recherches, je n'ai toujours aucune idée de comment résoudre le problème. J'apprécierais grandement tous les conseils 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.
swift
swift4
xcode9-beta
DaleK
la source
la source
Réponses:
Je me suis débarrassé de cet avertissement en changeant le paramètre de construction "Swift 3 @objc Inference" de mes cibles sur "Par défaut".
De cet article :
Veuillez également vous référer à cette proposition Swift pour plus d'informations.
la source
@objc
inférence Swift 3 en mode Swift 4 est obsolète. Veuillez adresser@objc
les avertissements d'inférence obsolètes , tester votre code avec la@objc
journalisation " Utilisation de l' inférence Swift 3 obsolète "activée et désactiver l'@objc
inférence Swift 3. " Une idée où activer la@objc
journalisation de l'inférence Swift 3 ?- Qu'est-ce que l'
@objc
inférence? Que se passe-t-il?Dans
Swift 3
, le compilateur déduit@objc
à 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!Dans
Swift 4
, le compilateur ne fait plus cela (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 génération. Ceci est contrôlé via le
SWIFT_SWIFT3_OBJC_INFERENCE
paramètre de construction. Dans un projet antérieur à Swift 4, ce paramètre est défini surOn
. Je recommanderais de régler ce paramètre surDefault
(ouOff
), qui est maintenant l'option par défaut sur un nouveau projet.Il faudra un certain temps pour tout convertir, mais comme c'est la valeur par défaut pour Swift 4, cela vaut la peine.
- Comment puis-je arrêter les avertissements / erreurs du compilateur?
Il existe deux façons de convertir votre code afin que le compilateur ne se plaint pas.
L'une consiste à utiliser
@objc
sur chaque fonction ou variable qui doit être exposée au runtime Objective-C:L'autre est d'utiliser
@objcMembers
par uneClass
déclaration. Cela garantit d'ajouter automatiquement@objc
à TOUTES les fonctions et variables de la classe. C'est le moyen le plus simple, mais cela a un coût, par exemple, il peut augmenter la taille de votre application en exposant des fonctions qui n'ont pas besoin d'être exposées.- Qu'est-ce que c'est
@objc
et pourquoi est-il nécessaire?Si vous introduisez de nouvelles méthodes ou variables dans une classe Swift, les marquer comme les
@objc
expose au runtime Objective-C. Cela est nécessaire lorsque vous avez du code Objective-C qui utilise votre classe Swift ou, si vous utilisez des fonctionnalités de type Objective-C commeSelectors
. Par exemple, le modèle d'action cible:button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
- Pourquoi ne marquerais-je pas tout
@objc
?Il y a des négatifs qui accompagnent le marquage de quelque chose comme
@objc
:Veuillez garder à l'esprit qu'il s'agit d'un résumé de très haut niveau et qu'il est plus compliqué que je ne l'ai écrit. Je recommanderais de lire la proposition actuelle pour plus d'informations.
Sources:
la source
@objc
n'implique pas de répartition dynamique, Swift est libre d'utiliser la répartition statique ou virtuelle (et éventuellement d'exécuter du code différent en conséquence). Ledynamic
mot clé est requis pour forcer Swift à utiliser la répartition dynamique.@objc
privé, que devons-nous utiliser?SWIFT_SWIFT3_OBJC_INFERENCE
àOn
. Convertissez en Swift 4. Ensuite, attaquez le@objc
truc. Pour faire simple, suivez les règles de base: SI la classe Swift est utilisée dans le code Objc-C (via un en-tête de pontage), utilisez@objcMembers
, sinon, un par un@objc
. Utilisez simplement la recherche Xcode pour savoir si la classe Swift est appelée à partir de n'importe quel.m
fichier. Cela devrait rendre la conversion relativement indolore.@objc
changé dans Swift 4, puis de prendre la décision de corriger le projet et de le conserver.Migrator ne peut pas identifier toutes les fonctions qui ont besoin @objc inférées Objective-C Thunks marqué comme dépréciée pour vous aider à les trouver
• Construire des avertissements sur les méthodes dépréciées
de messages console lorsque thunks en cours d' exécution dépréciée
la source
J'ai eu cet avertissement avec le paramètre "Swift 3 @objc Inference" = "Default". Puis j'ai réalisé que c'était réglé pour le projet - pas pour la cible. Assurez-vous donc que vous disposez du paramètre "Par défaut" dans votre cible pour vous débarrasser de l'avertissement.
la source
Vous pouvez simplement passer à "par défaut" au lieu de "ON". Semble plus adhérent à la logique d'Apple.
(mais tous les autres commentaires sur l'utilisation de
@obj
restent valables.)la source
En effet, vous vous débarrasserez de ces avertissements en désactivant Swift 3 @objc Inference. Cependant, des problèmes subtils peuvent apparaître. Par exemple, KVO cessera de fonctionner. Ce code fonctionnait parfaitement sous Swift 3:
Après la migration vers Swift 4 et la définition par défaut de «Swift 3 @objc Inference», certaines fonctionnalités de mon projet ont cessé de fonctionner . Il m'a fallu un débogage et des recherches pour trouver une solution. Selon ma meilleure connaissance, voici les options:
Réactiver l'inférence @objc vous laisse avec les avertissements, mais c'est la solution la plus rapide. Notez qu'il n'est disponible que pour les projets migrés à partir d'une version antérieure de Swift. Les deux autres options sont plus fastidieuses et nécessitent des fouilles de code et des tests approfondis.
Voir également https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md
la source
Je suis un développeur iOS occasionnel (bientôt plus) mais je ne pouvais toujours pas trouver le paramètre comme guidé par l'autre réponse (puisque je n'avais pas cet élément de trousseau que la réponse montre), alors maintenant que je l'ai trouvé, je pensais Je pourrais simplement ajouter cet instantané avec les emplacements en surbrillance que vous devrez cliquer et trouver.
la source
Vous pouvez essayer de «mettre à jour le pod» et / ou de «flutter clean»
J'ai également défini ce paramètre dans xcode.
Le paramètre d'interface Objective-C est le suivant:
la source
Inférence Swift 3 @objc L'utilisation de l'inférence Swift 3 @objc en mode Swift 4 est déconseillée. Veuillez adresser les avertissements d'inférence @objc obsolètes, testez votre code avec la journalisation «Utilisation de l'inférence Swift 3 @objc obsolète» activée, puis désactivez l'inférence en modifiant le paramètre de génération «Swift 3 @objc Inference» sur «Par défaut» pour «XMLParsingURL» cible.
arrivé au
La première étape a obtenu le paramètre de construction
Rechercher pour construire l'inférence de paramètre
changer swift 3 @objc Inference Default
entrez la description de l'image ici
la source
Tout ce dont vous avez besoin est d'exécuter un test, attendez la fin, après cela allez dans Build Setting, recherchez dans Build Setting Inference, changez swift 3 @objc Inference en (Default). c'est tout ce que j'ai fait et travaillé parfaitement.
la source
utilisez func call @objc
la source
En plus de ce que @wisekiddo a dit, vous pouvez également modifier vos paramètres de build dans le
project.pbxproj
fichier en définissant l'inférence Swift 3 @obj par défaut commeSWIFT_SWIFT3_OBJC_INFERENCE = Default;
pour vos versions de build (c.-à-d. Déboguer et publier), surtout si vous venez d'un autre environnement en plus de Xcodela source