Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

393
Views
Las clases Swift marcadas con @objc no se agregan al encabezado "-Swift.h" en el marco mixto Objective-C/Swift

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?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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.

  1. Utilice el antiguo sistema de compilación. Cuando se usa el nuevo sistema de compilación, se produce un error cuando intenta fusionar el mapa del módulo para el archivo de la biblioteca estática y dice que no puede encontrar el archivo *-Swift.h, ya sea que exista o no.
  2. Cree su marco convirtiéndolo en un envoltorio alrededor de la biblioteca estática al:
    • Dándoles a ambos el mismo nombre de producto y nombre de módulo.
    • Agregue un solo archivo .Swift a la compilación del marco para que tenga algo que compilar y vinculará las bibliotecas rápidas.
    • enlace a la biblioteca estática en el marco.
    • Agregue todos los encabezados necesarios a los encabezados públicos del marco.
    • Agregue todos los encabezados públicos al encabezado general.
    • Use una fase Ejecutar secuencia de comandos para copiar el archivo *-Swift.h de la compilación de la biblioteca estática a la compilación posterior del producto del marco.
    • Para cualquier encabezado público que incluya *-Swift.h, es posible que deba procesar el encabezado y reemplazar la importación de *-Swift.h con la importación de marco adecuada, es decir, . Esto no sería recomendable debido a posibles importaciones cíclicas en el encabezado general.
  3. Al ejecutar una limpieza, cree primero el objetivo del marco manualmente, antes de crear el objetivo de la aplicació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.

over 4 years ago · Santiago Trujillo Report

0

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

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!