Xcode 6 / Beta 4: no se admite el uso de encabezados de puente con objetivos de marco


Acabo de actualizar a Xcode 6 Beta 4 y tengo un marco que he creado para Vistas en vivo en Beta 2. Debido a otro error de swift , necesitaba usar algún código Obj-C. Sin embargo, al actualizar, obtengo el siguiente error:

Error: no se admite el uso de encabezados de puente con destinos de marco

No he visto nada en las notas de la versión, ni he encontrado ninguna otra ruta de migración. ¿Alguien más ha visto esto y ha llegado a una solución?

Me doy cuenta de que Beta 3 eliminó la necesidad de frameworks para vistas en vivo, pero tiene sentido en mi caso si puedo hacer que funcione. Sin embargo, puedo eliminarlo como alternativa, pero preferiría usar un marco si no están totalmente rotos en la Beta 4.

Author: Community, 2014-07-22

3 answers

Como indica el error, las cabeceras de puente no están permitidas en Frameworks. La sección Importando Código desde el Mismo Framework Target de la documentación de Mix & Match de apple lo indica. Como dicen, necesitas "En tu archivo de encabezado umbrella, importa cada encabezado Objective-C que quieras exponer a Swift".

Sin embargo, descubrí que es posible que también necesite hacer públicos esos encabezados específicos. Esta respuesta revisa por qué y cómo hacerlo: Swift error del compilador:"cabecera no modular dentro del módulo framework" .

Entonces, haz esto:

  1. Elimine el archivo de cabecera puente.
  2. Elimine las referencias al archivo de encabezado bridging en la configuración de compilación para el framework
  3. Agregue las cabeceras necesarias a su archivo umbrella ([ProductName].h)
  4. Haga públicos los archivos incluidos en la sección "Headers" del framework de sus "Fases de compilación".
  5. Limpiar y reconstruir.

Nota : "umbrella header file" es un archivo (llamado [ProductName].h) que generalmente representa todas las cabeceras públicas de un framework. Por lo general, es solo una lista de #import statements a otras cabeceras contenidas en el framework. En Xcode, si abres UIKit.h, verá un buen ejemplo de un archivo umbrella.

 175
Author: DeepFriedTwinkie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:12

Hay dos posibilidades. Agregar los encabezados necesarios al archivo de encabezado umbrella y hacerlos públicos es una forma. Sin embargo, esto es un problema si las cabeceras deben estar disponibles para Swift, pero no públicas.

La segunda posibilidad que hará que los encabezados internos estén disponibles para Swift se describe en detalle aquí. Esencialmente, se debe crear un mapa de módulos similar a lo siguiente:

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

Esto se puede incluir en XCode usando la configuración:

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  
 10
Author: Jan Rüegg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-24 12:42:12

Véase Importar Objective-C a Swift.

Para importar código Objective-C a Swift desde el mismo framework

  1. En Configuración de compilación, en Empaquetado, asegúrese de que la configuración de Módulo Define para ese destino de marco esté establecida en "Sí".
  2. En su archivo de encabezado umbrella, importe cada encabezado Objective-C que desee exponer a Swift. Por ejemplo:

        #import "XYZ/XYZCustomCell.h"
        #import "XYZ/XYZCustomView.h"
        #import "XYZ/XYZCustomViewController.h"
    
  3. Hacer públicos los archivos incluidos en la sección "Headers" del framework de su " Build Fase".

  4. Limpiar y reconstruir.

Swift verá cada encabezado que exponga públicamente en su encabezado paraguas. El contenido de los archivos Objective-C en ese marco estará disponible en cualquier archivo Swift dentro de ese marco target automáticamente, sin ninguna declaración de importación. Utilice su código Objective-C personalizado con la misma sintaxis Swift que usa con las clases del sistema.

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

Importante: el "umbrella header file" significa el archivo {moduleName}.h. Por cierto, el nombre de destino es {moduleName}.marco.

 7
Author: Ralph Shane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-16 15:20:29