Estoy intentando convertir una antigua biblioteca vinculada estáticamente en un marco. Con una combinación de Swift y Objective C en la biblioteca estática, todos los encabezados se generan correctamente. Sin embargo, al cambiar a un objetivo de marco y agregar archivos rápidos, marcados con el encabezado @objc, la clase no se agrega al encabezado -Swift.h. Puedo importar el encabezado, pero no se encuentran las clases rápidas. Esto está en Xcode 10.2 y se intentó con Swift 4.2 y 5.
¿Hay alguna configuración particular en XCode que afectará la generación del encabezado *-Swift.h en un objetivo de marco mixto Objective C/Swift?
El problema parece ser una combinación del nuevo sistema de compilación de Apple, las expectativas que establecieron al compilar y la cantidad de interdependencias en la configuración del proyecto.
El nuevo sistema de compilación ejecuta las compilaciones de Swift en paralelo. Cuando se tienen varias dependencias de biblioteca/marco que se combinan con Objective C y Swift, el compilador parece no generar los archivos -Swift.h a tiempo. En las bibliotecas estáticas, los archivos -Swift.h parecen generarse al final del proceso de compilación de Swift, lo que significa que no se generan lo suficientemente rápido para que los utilicen los archivos de Objective C cuando se produce la compilación de Objective C. Al generar un marco, parece que el Compilador genera el encabezado al comienzo del proceso de compilación y los archivos Swift no están completamente compilados y el archivo -Swift.h no se genera correctamente con las interfaces y protocolos de clase de Objective C.
Lo que esto significa termina significando que no podemos confiar en las "dependencias de destino" para construir correctamente los proyectos dependientes.
Entonces, ¿cómo podemos construir nuestro .framework de Objective C combinado y -Swift.h sin una tonelada de secuencias de comandos manuales?
Aquí están los trucos que descubrí que funcionarán.
A continuación se muestra un script de ejemplo para copiar la compilación posterior del archivo *-Swift.h.
header_file="${TARGET_TEMP_DIR}/../${PRODUCT_MODULE_NAME}.build/DerivedSources/${PRODUCT_MODULE_NAME}-Swift.h" header_dir="${BUILT_PRODUCTS_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}" mkdir -p "$DIR" echo "copying $header_file $header_dir" cp -f "$FILE" "$DIR"ACTUALIZADO
Marcar el modo de compilación Swift de todos los módulos como "Módulo completo" parece tener un efecto positivo en este problema, pero no lo he probado por completo.
Tuve un problema similar. En mi caso, era un problema conocido en Xcode 10.2:
https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_release_notes
Si está creando un marco que contiene código Swift y usa lipo para crear un binario que admita plataformas de dispositivo y simulador, también debe combinar los encabezados Framework-Swift.h generados para cada plataforma para crear un encabezado que admita tanto el dispositivo como el simulador. plataformas (48635615) ...
En mi caso lo único que tuve que hacer fue actualizar el Carthage a la última versión 0.33.0