programación programacion objective lenguaje caracteristicas apple ios objective-c macros swift

ios - programacion - Cómo usar el código de Objective-C con las macros de#define en Swift



swift wikipedia (3)

Estoy tratando de usar una biblioteca de Objective-C de terceros en un proyecto Swift mío. He importado la biblioteca con éxito en Xcode y he creado un archivo <Project>-Bridging-Header.h que me permite usar mis clases de Objective-C en Swift.

Sin embargo, parece que tengo un problema: el código de Objective-C incluye un archivo Constants.h con la macro #define AD_SIZE CGSizeMake(320, 50) . Importar Constants.h en mi <Project>-Bridging-Header.h no produce una constante global AD_SIZE que mi aplicación Swift pueda usar.

Investigué un poco y vi que la documentación de Apple aquí en "Macros complejas" dice que

“En Swift, puede usar funciones y genéricos para lograr los mismos resultados [como macros complejas] sin ningún compromiso. Por lo tanto, las macros complejas que se encuentran en C y en los archivos fuente de Objective-C no están disponibles para su código Swift ".

Después de leer eso, logré que funcionara bien especificando let AD_SIZE = CGSizeMake(320, 50) en Swift, pero quiero mantener la compatibilidad futura con la biblioteca en caso de que estos valores cambien sin que yo lo sepa.

¿Hay una solución fácil para esto en Swift o mi encabezado puente? Si no es así, ¿hay alguna manera de reemplazar #define AD_SIZE CGSizeMake(320, 50) en Constants.h y mantener las cosas compatibles con cualquier aplicación Objective-C existente que use la antigua macro AD_SIZE ?


Lo que hice es crear un método de clase que devuelve #define.

Ejemplo:

archivo .h:

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

archivo .m:

+ (CGSize)adSize { return AD_SIZE; }

Y en Swift:

Como este es un método de clase, ahora puede usarlo casi como lo haría con #define. Si cambia su macro #define, se reflejará en el nuevo método que creó en Swift:

let size = YourClass.adSize ()


Resolví esto reemplazando

#define AD_SIZE CGSizeMake(320, 50)

en la biblioteca Constants.h con

extern CGSize const AD_SIZE;

y añadiendo

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

en el archivo Constants.m la biblioteca.


escribe tus constantes después de la declaración de clase. Me gusta esto...

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