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