Importation d’un protocole Swift dans la classe Objective-C

J’essaie d’importer un protocole Swift nommé AnalyticProtocol dans une classe Objective-C nommée AnalyticFactory .

 protocol AnalyticProtocol { } 

Je pars d’un projet Objective-C existant (je n’ai pas créé de nouveau projet Swift avec xCode et je n’ai pas trouvé comment configurer mon projet Objective-C pour qu’il devienne un projet Swift dans xCode 6 ).

Dans mon fichier Swift, j’ai inclus le fichier .h nommé MyProjectName-Swift.h mais le compilateur me renvoie une erreur en me disant qu’il n’existe pas . J’ai donc créé un fichier .h nommé MyProjectName-Swift.h qui est en fait vide (je ne sais pas ce que je devrais mettre à l’intérieur).

Dans la documentation Apple, ils ont dit que je devais inclure mon fichier .h nommé MyProjectName-Swift.h dans mon fichier .m . Mais je n’ai pas besoin de l’inclure dans mon fichier .m mais dans mon fichier .h . Est-ce que cela peut être problématique?

Quand j’essaie de comstackr, j’ai cette erreur:: 0: erreur: xxxAnalyticFactory.h: 39: impossible de trouver la déclaration de protocole pour ‘AnalyticProtocol’

Et le code incriminé:

 @interface AnalyticFactory : NSObject { Class _analyticProtocolClass; // The type of the analytic class currently used. } 

Je pense que je ne comprends pas bien comment importer un protocole Swift dans une classe Objective-C.

Est-ce que quelqu’un voit une erreur dans ce que je fais?

Vous devez append l’atsortingbut @objc à votre protocole Swift comme @objc :

 @objc protocol AnalyticProtocol { } 

Il n’est pas possible d’importer l’en-tête Swift généré par Xcode dans les fichiers d’en-tête objC.

Donc, comme vous voulez utiliser le code Swift dans un fichier d’en-tête objC, vous devrez “déclarer” les classes et les protocoles que vous voulez utiliser dans le fichier d’en-tête objC, comme ceci:

 @protocol AnalyticProtocol; 

Vous pouvez maintenant utiliser le protocole dans votre déclaration de classe objC:

 @interface AnalyticFactory : NSObject { Class _analyticProtocolClass; // The type of the analytic class currently used. } 

Dans votre fichier d’implémentation (le fichier objC .m), vous pouvez importer le fichier d’en-tête Swift (“ProductModuleName-Swift.h”) généré par Xcode et l’implémentation correcte AnalyticProtocol sera désormais connue du compilateur.

Ceci est également décrit dans la section “Utilisation de Swift d’Objective-C” dans Apple Docs

Notez que XCode donnera un avertissement dans le fichier d’en-tête objC lorsque vous utiliserez le protocole déclaré avant (“Impossible de trouver la définition du protocole pour ‘AnalyticProtocol’), mais cela peut être ignoré – l’implémentation sera trouvée au moment de la compilation.

Pour quiconque a simplement besoin d’adopter un protocole, vous pouvez le faire en deux étapes, sans générer d’avertissement ni d’erreur:

  1. Dans votre fichier .swift , ajoutez @objc avant le nom du protocole:

     @objc protocol AnalyticProtocol { } 
  2. Dans votre fichier .m , importez l’en-tête Swift généré et adoptez le protocole dans une catégorie privée. (Le fichier d’en-tête est nommé automagiquement):

     #import "ProductModuleName-Swift.h" @interface AnalyticFactory ()  @end 

C’est l’approche recommandée par Apple. Vous pouvez en apprendre plus sur le mixage et la correspondance d’Objective-C et de Swift ici: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html