ventajas tutorial programación programacion objective lenguaje entre diferencias desventajas ios swift module frameworks clang

ios - tutorial - objective-c++



Clases de Objective C dentro de un marco dinámico basado en iOS Swift (1)

Situación:

Tengo un marco dinámico de iOS escrito en Swift. También tengo un montón de clases escritas en Objective C que usaría en mis clases de Swift (algunas son públicas, otras son privadas). Sin embargo , me gustaría que las clases Objective C no se expongan a proyectos que usan mi framework .

Lo que he intentado:

Encabezado de paraguas

Por lo que entiendo, debería importar utilizando #import header.h en mi archivo de encabezado paraguas, que generalmente es FrameworkName.h , y luego me aseguro de que todos los archivos de encabezado Objective C que deseo incluir en mis clases Swift estén marcados como "Public", en Build Fhases -> Headers.

Sin embargo, al hacerlo, expongo automáticamente el proyecto que utiliza mi marco a todas las clases privadas de Objective C que utiliza el marco.

Mapeo de módulos (con módulo separado)

Debido a esto, he estudiado el uso del mapeo de módulos, que está documentado aquí . He visto publicaciones de otros usuarios como este y este , así como este repositorio de Github .

Conseguí con éxito el siguiente trabajo:

//SharedClasses/module.modulemap module SharedClasses { } //SharedClasses/module.private.modulemap module SharedClasses.Private { header "header.h" export * }

El problema es que en mi proyecto (que tiene este marco importado), esto:

import Framework import Framework.SharedClasses

está permitido, y posteriormente las clases "ocultas" del Objetivo C están expuestas. Tal vez así es como funcionan los módulos? ¿Hay alguna manera de hacerlos verdaderamente privados?

Mapeo de módulos (con módulo privado de marco)

Además, he intentado crear un archivo module.private.modulemap en la raíz de mi framework con los siguientes contenidos:

explicit module Framework.Private { header "header.h" export * }

y luego vincularlo a la configuración de compilación de mi objetivo bajo MODULEMAP_PRIVATE_FILE. Sin embargo, cuando import Framework.Private en las clases Swift de mi marco, se produce un error de compilación:

"No existe ese módulo ''Framework.Private''

No entiendo por qué ocurre este error.

Mapeo de módulos (con encabezado privado)

Noté que en los documentos de Clang , se menciona un especificador private :

Un encabezado con el especificador privado no se puede incluir desde fuera del módulo.

Según entiendo, dado que todas las clases de Swift en mi framework ya forman parte del Framework del módulo, si creo un archivo module.modulemap con lo siguiente:

framework module Framework { umbrella header "Framework.h" private header "header.h" export * module * { export * } }

¡entonces todo debería estar funcionando! Los encabezados de Objective C solo son accesibles dentro del módulo (es decir, las clases Swift del marco) y no están expuestos a ningún proyecto que utilice el marco. Genial, pero no funciona ... el compilador simplemente no reconoce las clases de Objective C. No se arrojan otros errores, pero no puede usar los encabezados, por lo que es como si no hubiera incluido los encabezados en primer lugar. ¿POR QUÉ? ¿Y cuál es el especificador privado para entonces?

Soo, reiterando mi pregunta original:

¿Hay alguna manera de importar encabezados de Objective C para su uso en clases Swift, dentro de un marco dinámico de iOS, manteniéndolos privados y no accesibles desde cualquier proyecto que utilice dicho marco?

Gracias por leer, y perdón por la publicación larga. Ha sido un largo día (y noche) ...


Puede encontrar algún método de este enlace .

Simplemente cree una Carpeta (ej. PrivadaA) con module.modulemap donde incluya todos los encabezados de objetos que necesite usar en su clase Swift. p.ej

module $(ModuleName)Private { header "header.h" export * }

en Swift, puede usar: import $(ModuleName)Private

por lo tanto, el módulo predeterminado excluye estos encabezados cuando se usa import $(ModuleName) .

Desde mi experimento, el proyecto de prueba también puede import $(ModuleName)Private , pero no encontró ningún código útil.

Prueba esto de todos modos.