- 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 :