Importando Project-Swift.h en un archivo de clase Objective-C ... no encontrado


128

Tengo un proyecto que se inició en Objective-C, y estoy tratando de importar un código Swift en los mismos archivos de clase en los que he escrito Objective-C anteriormente.

He consultado los documentos de Apple sobre el uso de Swift y Objective-C en el mismo proyecto, así como una pregunta SO como esta, pero todavía no sirvió: sigo recibiendo el error de archivo no encontrado después de ponerlo #import "NewTestApp-Swift.h"( NewTestAppes el nombre del Producto y módulo).

Esto es lo que he hecho hasta ahora:

  1. En Define Modules, seleccionado YESpara la aplicación.
  2. Se aseguró de que el nombre del módulo del producto no tuviera espacio (consulte la siguiente captura de pantalla)

He intentado usar #import "NewTestApp-Swift.h"el interior ViewController.m, ViewController.hy AppDelegate.maunque ninguno de ellos ha funcionado.

¿Qué más estoy haciendo incorrectamente? Gracias por tu ayuda.


Captura de pantalla de la configuración:

ingrese la descripción de la imagen aquí


Errores que estoy encontrando actualmente:

ingrese la descripción de la imagen aquí


3
Eliminar todos los datos derivados ~/Library/Developer/Xcode/DerivedDatahizo el truco para mí.
wzhang84

Así es como resolví el problema: stackoverflow.com/a/45338549/8102549
schrulnz

Respuestas:


158

Me encontraba con el mismo problema y no pude hacer que mi proyecto se importara rápidamente en las clases obj-c. Usando Xcode 6, (debería funcionar para Xcode 6+) y pude hacerlo de esta manera ...

  1. Cualquier clase a la que necesite acceder en el archivo .h debe ser una declaración de reenvío como esta

@class MySwiftClass;

  1. SOLO en el archivo .m, si el código está en el mismo proyecto (módulo), entonces debe importarlo con

#import "ProductModuleName-Swift.h"

Enlace a la documentación de Apple al respecto

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c


3
Gracias por la respuesta. Eso me llevó en la dirección correcta. Tuve el mismo problema pero con un protocolo, así que tuve que agregar @protocol MySwiftProtocol en lugar de importarlo en mi archivo de encabezado.
palme

en la declaración de archivo .h de la clase sin importar que el archivo .h fue el truco para mí. Gracias
Sikander

1
Tenga en cuenta que si el nombre de su producto tiene un -carácter, el nombre del archivo de encabezado generado lo convertirá a _. por ejemplo, si el nombre de su producto es My-App, importaría My_App-Swift.h.
dvanoni

1
Encontré una nueva forma de encontrar el nombre de archivo de encabezado generado correcto: vaya a su objetivo -> Configuración de compilación -> Buscar palabras claveObjective-C Generated Interface Header Name , ¡bingo!
Itachi

2
He hecho ambas cosas y sigo viendo el mismo problema. ¿Crees que tiene que ver con el pedido?
ArielSD

83

Si el código Swift está dentro de un Módulo (como en su caso):

#import <ProductName/ProductModuleName-Swift.h>

Si el código Swift está dentro del proyecto (Swift mixto y ObjC):

#import <ProductModuleName-Swift.h>

En su caso, debe agregar esta línea en el archivo * .m:

#import <NewTestApp/NewTestApp-Swift.h>

IMPORTANTE: mire el "<" en la declaración de importación

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html


Gracias por responder a @ ikocel1. Lamentablemente estos no funcionaron. He intentado variaciones de <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h>y <NewTestApp/ViewController-Swift.h>todo dentro ViewController.m, pero sigo recibiendo el error "archivo no encontrado", a pesar Cleaningdel proyecto cada vez que intento una combinación. He incluido una captura de pantalla en el cuerpo de la pregunta en caso de que ayude.
daspianist

Todavía no he ingresado ningún código Swift ViewController.m. Solo he estado intentando importar los encabezados primero para intentar que acepte el código Swift. Voy a mezclar y combinar tanto el código de Objective-C como el de Swift ViewController.m.
daspianist

1
No sé si es posible mezclar directamente el código objc y el código rápido en el mismo archivo.
ikocel1

1
Gracias, supongo que esta fue la suposición que me basé en el documento "Mix and Match" de Apple ... pero supongo que no dentro del archivo real. ¡Gracias!
daspianist

66
No entendí por qué se aprobó esta respuesta. Sí, es correcto siguiendo la documentación, pero prácticamente tampoco funciona para mí. Incluso en la pregunta, es obvio que el usuario usa la sintaxis como se recomienda en esta respuesta, pero todavía recibe un error.
Darius Miliauskas

54

Cómo logré importar Swift en Objective-C:

  • Define el módulo establecido en SÍ (en el proyecto, no en el objetivo)
  • Nombre del módulo del producto establecido (en destino - no en proyecto)
  • En su ViewController.m, importe el código rápido con:

    #import "MyProductModuleName-Swift.h"
  • Agregue un archivo swift a su proyecto del objetivo-c (Archivo -> Nuevo -> Swift) y Xcode creará el encabezado de puente del objetivo-c a Swift, pero esto es crucial para que funcione también al revés, aparentemente.

Para la última pieza de este rompecabezas, gracias a Swiftoverload por hacerme consciente de agregar un archivo Swift a través de Xcode GUI y no solo arrastrar y soltar archivos swift existentes en mi proyecto para que funcione: http://nikolakirev.com/blog / using-swift-in-Objective-c-project


Excelentes notas Agregaría que el objetivo de prueba es su propio módulo y tendrá su propio encabezado llamado "<#TestTargetName #> - Swift.h" y que cualquier espacio en los nombres de destino se convertirá en espacios.
Chuck Krutsinger el

@ holm51 lamento preguntar esto, pero ¿dónde está Define Moduley Product Module Name?
matchifang

guiones -en el nombre serán convertidos a guiones _así
CyberMew

11

Usando Xcode 8.2.1 y si mira Proyecto > Configuración de compilación> Nombre de encabezado de interfaz generado por Objective-C , allí solo se muestra un archivo de encabezado llamado Producto -Swift.h

Esto significa que en lugar de importar cada módulo por separado del archivo Objective-C .m, utilizando el archivo individual -Swift.h, solo importa un Producto -Swift.h que agrega todos los módulos Swift.

Encontré el mismo problema al buscar la forma tradicional de importar módulos por separado, pero la versión actual de Xcode y Swift 3 lo cambió para usar solo un encabezado para la importación de todos los módulos.


hola peter, donde puedes encontrar este archivo? ¿O es autogenerado por xcode? Además, ¿tiene que configurar su archivo de pod de manera diferente debido a este cambio?
Rob Norback

@RobNorback Si no me equivoco, puede escribir 'import "Product-Swift.h" en el archivo de encabezado / implementación Obj-C para ver el efecto, sin hacer nada adicional. Asegúrese de que la configuración de su proyecto tenga todas las configuraciones habilitadas para la mezcla Swift y Obj-C. Además, todavía no he experimentado un problema con Podfile. Avíseme si veo las cosas de manera diferente.
petershine

Gracias, había pasado horas tratando de depurar esto, y el problema era que cada uno de los módulos de mi proyecto estaba generando su propio -Swift.harchivo de encabezado. Forzarlos a todos (tengo 5 objetivos) a usar un archivo de encabezado común me solucionó el problema.
Apoorv Khatreja

@ApoorvKhatreja, ¿cómo los obligaste a hacer eso? Escribió el nombre del archivo explícitamente?
Amit Raz

8

Pasó una hora en este tema, seguir estos pasos lo ayudará a comprender lo que falta:

  1. Abra la preferencia Xcode y navegue a la carpeta DerivedData
  2. Buscar "swift.h" en el buscador
  3. Si no puede encontrar ningún archivo project-swift.h, este archivo no se ha generado. Por lo general, debe agregar @objc a una de sus clases rápidas y compilar con éxito la aplicación, solo entonces Xcode generará este archivo
  4. Si encontró el archivo "xxx-swift.h", asegúrese de que su declaración de importación contenga el nombre correcto.

cómo-localizar-archivo-rápido


No agregue la misma respuesta a varias preguntas . Responda al mejor y marque el resto como duplicados, una vez que gane suficiente reputación. Si no es un duplicado, adapte la publicación a la pregunta y marque la opción de eliminación.
Bhargav Rao

¡Gracias por esto! Cambié el nombre de diplay de mi aplicación (no el del objetivo) y el encabezado Swift también cambió de nombre. Esta era la única forma en que podía encontrar lo que estaba pasando.
Lucas P.

Gracias por publicar una respuesta. Las capturas de pantalla y la forma precisa de los puntos me hacen desplazarme de inmediato + mirar + terminar mi búsqueda ... ¡problema resuelto!
Dklt

6

Estaba teniendo problemas para importar Swift en un proyecto Objective-C. Al final, busqué en la carpeta de datos derivados para verificar qué generaba Xcode 7. El nombre del archivo era completamente diferente al que esperaba.

Una vez que tuve el nombre de archivo real, lo importé y el proyecto podría compilarse.


2
¿Dónde se encuentra este archivo? Miro a mi alrededor y no pude encontrar nada
Amit Raz

5

-Swift.hXcode debería crearlo automáticamente si el código Swift expone una API a través de @objco @objcMembers[Acerca de]

Por lo general, una ubicación se parece a

~/Library/Developer/Xcode/DerivedData/
  ProductModuleName-foo/
    Build/
      Intermediates.noindex/
        ProductModuleName.build/
          Debug-iphoneos/
            ProductModuleName.build/
              DerivedSources/
                ProductModuleName-Swift.h

Puede ser cambiado por

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

Por defecto el valor es $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)


2

DEFINE MODULES: YES e importe "ProjectName-Swift.h" en el archivo .m de la clase Obj-C

Esto funcionó para mí para acceder a las clases Swift en Obj-c.


3
Pero, ¿cómo importarlo a un archivo .h si necesito una clase rápida en el encabezado objc?
Alexander Danilov

1

Había enfrentado el mismo problema con mi equipo cuando estaba trabajando en un proyecto usando git. Un desarrollador no ha actualizado Xcode a la última versión (7.3) que se requería para la última versión de Swift 2.2. Entonces, el compilador no ha reconocido la nueva sintaxis de Swift y no pudo generar la interfaz para la biblioteca de Swift (projectname-swift.h). ¡Comprueba si la versión de Xcode es la última!


En mi caso, enfrenté el problema porque había decidido posponer la migración a Swift 3 que ofrece Xcode. Como resultado, Xcode no pudo construir archivos fuente Swift y no generó los encabezados para incluir.
iutinvg

1

Durante el desarrollo, puede existir la posibilidad de que tenga una clase swift que no esté completamente implementada debido a que puede haber algunos errores de sintaxis. El archivo de encabezado swift estará disponible para usar solo si todos los archivos swift están libres de errores.

Asegúrese de que no haya errores de sintaxis en los archivos rápidos y luego intente importar el encabezado rápido en el archivo objetivo - c


1

Importar el archivo de encabezado, es decir

#import "<ProjectName>-Swift.h" 

dentro del archivo .h generó un error, indicando:

-Swift.h 'archivo no encontrado

y la construcción falló.

En su lugar use:

#import "<ProjectName>-Swift.h"

dentro del archivo .m, y aunque aparece el mismo error, la ejecución del proyecto de todos modos suprime el error.

Las clases rápidas están disponibles en el archivo .m.


1

Me enfrenté al problema con el nombre del proyecto (objetivo). Incluía el símbolo "-". Entonces la decisión fue la siguiente: si el nombre del proyecto es "Test-App", el nombre de la clase importada es "Test_App-Swift.h"


excelente solución
iOS Lifee

1

Si el nombre de su aplicación tiene algún carácter especial, use _ para caracteres especiales.

Por ejemplo, si el nombre de su aplicación es Nombre "Test App®"

Luego puede importar el archivo swift con "Test_App_-Swift.h".

El espacio y ® se reemplaza por _ mientras está importando.


0

Si tiene múltiples objetivos, asegúrese de haber construido todos los marcos


0

Xcode 11

Me encontré con este problema cuando construí en Xcode 11. Me tomó un tiempo descubrir qué estaba mal, pero esencialmente, había cambiado la configuración de "Nombre para mostrar" en la pestaña "General" del objetivo en lugar de cambiar directamente en el Info.plistarchivo a través de Pestaña "Información" en el destino.

Esto dio como resultado que Xcode 11.5 pasara por una reescritura / creación de un montón de configuraciones de compilación personalizadas completamente nuevas y modificara el nombre del módulo de la aplicación y el producto .app integrado. En este caso, el nuevo nombre para mostrar también tenía un carácter de barra diagonal ( /), que en última instancia podría ser la razón por la que no se estaba construyendo (consulte la respuesta de @Silversky Technology ).

De todos modos, resolví esto deshaciendo todos los cambios automáticos de Xcode 11.5 en el archivo del proyecto y haciendo manualmente el mismo cambio en el nombre para mostrar del paquete en el Info.plistarchivo y todo funciona perfectamente.

Desearía que te dijera que estaba haciendo cosas como esta antes de que lo haga y sin tu consentimiento.


0

Asegúrese de que su clase swift tenga la declaración pública y extienda NSObject:

public class MySwiftClass: NSObject {
    //...
}

La importación debería funcionar con comillas, no entre paréntesis, si la clase swift está en el mismo proyecto.


0

si agrega un archivo Swift primero, recuerde agregar un archivo Swift a su destino ..., en la columna izquierda

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.