2016-11-29 10 views
0

Dans l'objectif C, une catégorie ne sera "utilisée" dans une classe que si je l'ai importée. Donc, si j'ai une catégorie NSString+category, je dois #import NSString+category.h dans chaque classe que je veux l'utiliser.Exclure la catégorie Objective C de certaines classes Swift

J'ai une telle catégorie, et certaines des classes que je veux l'utiliser sont écrites dans Swift. Si j'expose cette catégorie à Swift en la plaçant dans l'en-tête Bridging, toutes les classes swift l'utiliseront. Comment cela peut-il être évité?

Remarque: Ma catégorie est actuellement sur UIViewController et le code que j'ai mis là doit seulement être utilisé par QUELQUES ViewControllers. Il semble erroné et inutile d'utiliser cette catégorie sur les "autres" ViewControllers.

+3

"Dans l'objectif C, une catégorie ne sera" utilisée "dans une classe que si je l'ai importée." Ce n'est pas vrai. les méthodes de la catégorie sont toujours présentes sur la classe. L'en-tête fournit seulement _visibility_: vous obtiendrez une erreur de compilation si vous essayez de les appeler sans l'importation. –

+0

Aha. Ma faute. Je suppose que cela répond efficacement à ma question. – Joakim

+0

Pouvez-vous montrer le code? J'ai également créé un tutoriel complet pour utiliser Swift et Objective-c ensemble. http://stackoverflow.com/a/40887287/4488252 –

Répondre

2

Votre hypothèse de base est incorrecte:

Dans l'objectif C, une catégorie sera seulement « être utilisé » dans une classe si je l'importer

Les méthodes dans une catégorie sont présents sur la class si la catégorie est compilée. L'importation de l'en-tête rend les noms de méthodes visibles; sans cela, le compilateur vous avertira si vous essayez d'envoyer un message en utilisant un de ces noms. (Vous pouvez appeler les méthodes en utilisant performSelector: ou la bibliothèque d'exécution si vous êtes déterminé.)

La même chose est vraie pour votre classe Swift, et en raison de la façon dont les en-têtes Objective-C sont amenés à Swift, je ne fais pas Je crois qu'il existe un moyen de limiter la visibilité des méthodes dans votre code Swift.