- 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 sur On
. Je recommanderais de régler ce paramètre surDefault
(ou Off
), 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:
@objc func foo() {
}
L'autre est d'utiliser @objcMembers
par une Class
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.
@objcMembers class Test {
}
- 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 comme Selectors
. 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
:
- Augmentation de la taille binaire de l'application
- Pas de surcharge de fonction
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: