Este es un comportamiento esperado del compilador y por una muy buena razón.
Creo que la mayoría de las personas que se encuentran con estos problemas se deben a que cambian de Application Target
una Framework Target
y comienzan a agregar encabezados C y Objective C en el encabezado general del marco esperando que tenga el mismo comportamiento que el Encabezado de puente de la aplicación , que se comporta de manera diferente. El encabezado general está diseñado para un marco obj-c mixto rápido y su propósito es exponer las API al mundo exterior que su marco tiene en el objetivo-c o c. Eso significa que los encabezados que colocamos allí deben estar en el ámbito público.
No debe usarse como un lugar que exponga los encabezados de Objective-C / C que no son parte de su marco al código rápido de su marco. Porque en ese caso, estos encabezados también estarán expuestos como parte de nuestro módulo marco al mundo exterior, que a menudo no es lo que queremos hacer, ya que rompe la modularidad. (Y esa es exactamente la razón por la cual la opción No incluye modular incluye en los módulos de marco el valor predeterminado es NO )
Para exponer la biblioteca Objective-C / C a su código swift marco, debemos definir un módulo swift separado para dicha biblioteca. Entonces import YourLegacyLibrary
se puede usar un swift estándar .
Permítanme demostrar esto en un escenario típico: incrustarlo libxml2
en nuestro marco.
1. Primero debe crear un module.modulemap
archivo que se vea de esta manera:
Para el marco OSX:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
Para el marco de iOS:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
Todo lo que hace es envolver el encabezado y cualquier otro encabezado al que haga referencia dentro del módulo swift, para que swift pueda generar los enlaces rápidos para estas interfaces C.
2. Luego, en el directorio del proyecto xcode, cree una carpeta SwiftLibXML2
y coloque este module.modulemap allí
3. En Configuración de compilación , agregue $(SDKROOT)/usr/include/libxml2
a las rutas de búsqueda de encabezado
4. En Configuración de compilación , agregue $(SRCROOT)/SwiftLibXML2
a Importar rutas
5. En la pestaña General del proyecto , agregue libxml2.tbd
a Marcos vinculados y Bibliotecas .
Ahora importa este módulo donde sea necesario con:
import SwiftLibXML2
(si desea buscar un módulo más completo, ejemplo de mapa, sugeriría hacer referencia al módulo de módulo de Darwin en /usr/include/module.modulemap
, necesitaría tener instaladas las herramientas de línea de comandos de Xcode para ir allí, referencia Falta / usr / incluir en OS X El Capitan )