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

131

Acabo de actualizar a Xcode 6 Beta 4 y tengo un marco que creé para Live Views en Beta 2. Debido a otro error rápido , necesitaba usar un código Obj-C. Sin embargo, cuando actualizo, aparece el siguiente error:

error: el uso de encabezados de puente con objetivos de marco no es compatible

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 llegó a una solución?

Me doy cuenta de que Beta 3 eliminó la necesidad de marcos 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 Beta 4.

Chris Conover
fuente
"Me doy cuenta de que Beta 3 eliminó la necesidad de marcos". ¿Cómo?
hnh
2
(para vistas en vivo) - editado
Chris Conover
1
Me encuentro con el mismo problema.
Simon Germain
2
Wow, tu pequeña edición allí mejoró mi vida mucho mejor: no escuché este cambio (eliminando la necesidad de marcos) en ningún lado y me golpeó la cabeza con todos estos objetivos de marco para vistas en vivo durante horas. ¡Muchas gracias por este @chrisco!
yonix

Respuestas:

232

Como indica el error, los encabezados de puente no están permitidos en Frameworks. La sección Importar código desde el mismo marco objetivo de la documentación de Apple Mix & Match sugiere esto. Como dicen, debe "En su archivo de encabezado paraguas, importar todos los encabezados de Objective-C que desee exponer a Swift".

Sin embargo, descubrí que es posible que también necesites hacer públicos esos encabezados específicos. Esta respuesta revisa por qué y cómo hacer eso: Error del compilador Swift: "encabezado no modular dentro del módulo marco" .

Entonces, haz esto:

  1. Elimine su archivo de encabezado de puente.
  2. Elimine referencias al archivo de encabezado de puente en la configuración de compilación para el marco
  3. Agregue los encabezados necesarios a su archivo paraguas ([ProductName] .h)
  4. Haga públicos los archivos incluidos en la sección "Encabezados" del marco de sus "Fases de compilación".
  5. Limpiar y reconstruir.

Nota : El "archivo de encabezado paraguas" es un archivo (denominado [ProductName] .h) que generalmente representa todos los encabezados públicos de un marco. Por lo general, es solo una lista de declaraciones de #importación a otros encabezados contenidos en el marco. En Xcode, si abre UIKit.h, verá un buen ejemplo de un archivo paraguas.

DeepFriedTwinkie
fuente
3
Gracias por la respuesta sucinta (marcada como tal). Había leído esa sección pero estaba confundido en cuanto a la distinción entre Umbrella y el encabezado de Bridging.
Chris Conover
1
@ zaxy78 echa un vistazo a la sección "Importar Swift en Objective-C" de este documento: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
DeepFriedTwinkie
44
@DeepFriedTwinkie, ¿a qué archivo paraguas se refiere cuando dice: "Agregue los encabezados necesarios a su archivo paraguas"? Gracias.
Allan Macatingrao
2
Esto es exactamente lo que necesitaba. Agregarlos a la sección pública fue la solución.
olivaresF
20
¿Estoy en lo cierto al suponer que las clases que quiero mantener privadas en mi marco que deben ser utilizadas por una clase rápida ahora deben hacerse públicas a cualquiera que use mi marco? No parece una solución ideal.
ospr
28

Hay dos posibilidades Agregar los encabezados necesarios al archivo de encabezado general y hacerlos públicos es una forma. Sin embargo, esto es un problema si los encabezados deberían estar disponibles para Swift, pero no públicos.

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ódulo similar al siguiente:

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

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

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  
Jan Rüegg
fuente
2
¡Excelente! Gracias. Técnica muy preferida sobre hacer públicos todos los encabezados.
David H
Recomiendo encarecidamente
Esta es la respuesta correcta, pero dependiendo de lo que esté tratando de lograr, puede salirse con la suya usando algunas macros proporcionadas por Apple que ayudan mucho con la interoperabilidad Swift-Objc: developer.apple.com/documentation/swift/ ...
Joe Susnick
La headerdeclaración acepta una ruta relativa. ¿Qué haces cuando quieres agregar los encabezados de otro marco?
Georgios
13

Consulte Importar Objective-C en Swift .

Para importar código Objective-C en Swift desde el mismo marco

  1. En Configuración de compilación, en Empaquetado, asegúrese de que la configuración de Definir módulo para ese objetivo de marco esté establecida en "Sí".
  2. En su archivo de encabezado general, importe todos los encabezados de Objective-C que desee exponer a Swift. Por ejemplo:

        #import "XYZ / XYZCustomCell.h"
        #import "XYZ / XYZCustomView.h"
        #import "XYZ / XYZCustomViewController.h"
    
  3. Haga públicos los archivos incluidos en la sección "Encabezados" del marco de sus "Fases de compilación".

  4. Limpiar y reconstruir.

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

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

Importante: el "archivo de encabezado paraguas" significa el archivo {ModuleName} .h. Por cierto, el nombre de destino es {ModuleName} .framework.

Ralph Shane
fuente
1
Quiero usar archivos objc dentro del archivo Swift de mis módulos, pero no quiero exponerlos a otros módulos. ¿Como lo puedo hacer?
Sazzad Hissain Khan
0

En mi caso, solo eliminé la Objective-C Bridging Headerconfiguración de mi marco Build Settings.

ingrese la descripción de la imagen aquí

Denis Kutlubaev
fuente