web-dev-qa-db-fra.com

Comment utiliser le code Objective-C avec les macros #define dans Swift

J'essaie d'utiliser une bibliothèque Objective-C tierce dans un de mes projets Swift. J'ai importé la bibliothèque avec succès dans Xcode et j'ai créé un <Project>-Bridging-Header.h qui me permet d'utiliser mes classes Objective-C dans Swift.

Il semble cependant que je rencontre un problème: le code Objective-C inclut un fichier Constants.h Avec la macro #define AD_SIZE CGSizeMake(320, 50). L'importation de Constants.h Dans mon <Project>-Bridging-Header.h N'entraîne pas une constante globale AD_SIZE Que mon Swift peut utiliser.

J'ai fait quelques recherches et j'ai vu que la Apple ici sous "Macros complexes" dit que

"Dans Swift, vous pouvez utiliser des fonctions et des génériques pour obtenir les mêmes résultats [que des macros complexes] sans aucun compromis. Par conséquent, les macros complexes qui se trouvent dans les fichiers source C et Objective-C ne sont pas mises à la disposition de votre code Swift. "

Après avoir lu cela, je l'ai fait fonctionner correctement en spécifiant let AD_SIZE = CGSizeMake(320, 50) dans Swift, mais je veux maintenir la compatibilité future avec la bibliothèque au cas où ces valeurs changeraient à mon insu.

Existe-t-il une solution simple pour cela dans Swift ou mon en-tête de pontage? Sinon, existe-t-il un moyen de remplacer la #define AD_SIZE CGSizeMake(320, 50) dans Constants.h Et de garder les choses rétrocompatible avec toutes les applications Objective-C existantes qui utilisent l'ancienne macro AD_SIZE?

27
ankushg

J'ai résolu cela en remplaçant

#define AD_SIZE CGSizeMake(320, 50)

dans le Constants.h de la bibliothèque avec

extern CGSize const AD_SIZE;

et en ajoutant

CGSize const AD_SIZE = { .width = 320.0f, .height = 50.0f };

dans le fichier Constants.m de la bibliothèque.

5
ankushg

Ce que j'ai fait, c'est de créer une méthode de classe qui renvoie la #define.

Exemple:

fichier .h:

#define AD_SIZE CGSizeMake(320, 50)
+ (CGSize)adSize;

fichier .m:

+ (CGSize)adSize { return AD_SIZE; }

Et dans Swift:

Comme il s'agit d'une méthode de classe, vous pouvez maintenant l'utiliser presque comme vous le feriez avec #define. Si vous modifiez votre macro #define - cela se reflétera dans la nouvelle méthode que vous avez créée dans Swift:

let size = YourClass.adSize ()

11
YogevSitton

écrivez vos constantes après la déclaration de classe. comme ça...

class ForgotPasswrdViewController: UIViewController {
let IS_IPHONE5 = fabs(UIScreen.mainScreen().bounds.size.height-568) < 1;
let Tag_iamTxtf = 101
4
Mohit tomar