Importazione di Project-Swift.h in un file di classe C Objective-C non trovato


128

Ho un progetto che è stato avviato in Objective-C e sto cercando di importare del codice Swift negli stessi file di classe in cui ho scritto precedentemente Objective-C.

Ho consultato i documenti Apple sull'uso di Swift e Objective-C nello stesso progetto, così come una domanda SO come questa, ma ancora inutile: continuo a ottenere l'errore non trovato dopo aver inserito il file #import "NewTestApp-Swift.h"( NewTestAppè il nome del prodotto e modulo).

Ecco cosa ho fatto finora:

  1. In Define Modules, selezionato YESper l'app.
  2. Garantito che il nome del modulo del prodotto non avesse spazio (vedi screenshot sotto la domanda)

Ho provato a usando #import "NewTestApp-Swift.h"dentro ViewController.m, ViewController.he AppDelegate.mma nessuno di loro ha funzionato.

Cos'altro sto facendo in modo errato? Grazie per l'aiuto.


Schermata delle impostazioni:

inserisci qui la descrizione dell'immagine


Errori che sto riscontrando attualmente:

inserisci qui la descrizione dell'immagine


3
Elimina tutti i dati derivati ​​in ~/Library/Developer/Xcode/DerivedDatafatto il trucco per me.
wzhang84,

Ecco come ho risolto il problema: stackoverflow.com/a/45338549/8102549
schrulnz

Risposte:


158

Stavo riscontrando lo stesso problema e non riuscivo a importare rapidamente il mio progetto in classi obj-c. Usando Xcode 6, (dovrebbe funzionare per Xcode 6+) ed è stato in grado di farlo in questo modo ....

  1. Qualsiasi classe a cui devi accedere nel file .h deve essere una dichiarazione in avanti come questa

@class MySwiftClass;

  1. Nel file .m SOLO, se il codice si trova nello stesso progetto (modulo), è necessario importarlo con

#import "ProductModuleName-Swift.h"

Link alla documentazione di Apple al riguardo

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


3
Grazie per la risposta. Questo mi ha portato nella giusta direzione. Ho avuto lo stesso problema ma con un protocollo, quindi ho dovuto aggiungere @protocol MySwiftProtocol invece dell'importazione nel mio file di intestazione.
palme

nel file .h la dichiarazione in avanti della classe senza imporre il file .h ha fatto il trucco per me. Grazie
Sikander,

1
Nota che se il nome del tuo prodotto contiene un -carattere, il nome del file di intestazione generato verrà convertito in _. ad es. se il nome del tuo prodotto è My-App, verrai importato My_App-Swift.h.
Dvanoni,

1
Ho trovato un nuovo modo per trovare il nome corretto del file di intestazione generato: vai al tuo obiettivo -> Impostazioni di costruzione -> Cerca parole chiaveObjective-C Generated Interface Header Name , bingo!
Itachi,

2
Ho fatto entrambe queste cose e sto ancora riscontrando lo stesso problema. Pensi che abbia a che fare con l'ordine?
ArielSD

83

Se il codice Swift si trova all'interno di un modulo (come nel tuo caso):

#import <ProductName/ProductModuleName-Swift.h>

Se il codice Swift è all'interno del progetto (misto Swift e ObjC):

#import <ProductModuleName-Swift.h>

Nel tuo caso, devi aggiungere questa riga nel file * .m:

#import <NewTestApp/NewTestApp-Swift.h>

IMPORTANTE: guardare "<" nell'istruzione import

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


Grazie per aver risposto a @ ikocel1. Purtroppo questi non hanno funzionato. Ho provato varianti di <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h>e <NewTestApp/ViewController-Swift.h>tutto dentro ViewController.m, ma continuo a ottenere l'errore "file not found", nonostante Cleaningil progetto ogni volta dopo aver provato una combinazione. Ho incluso uno screenshot nel corpo della domanda nel caso in cui sia di aiuto.
Daspianista,

Non ho ancora inserito alcun codice Swift in ViewController.m. Ho solo cercato di importare prima le intestazioni per cercare di farlo accettare il codice Swift. Combinerò sia il codice Objective-C che il codice Swift in ViewController.m.
Daspianista,

1
Non so se è possibile mescolare direttamente il codice objc e il codice rapido nello stesso file.
ikocel1,

1
Grazie, suppongo che questo fosse il presupposto che avevo basato sul documento "Mix and Match" di Apple .. ma suppongo che non sia all'interno del file reale. Grazie!
Daspianista,

6
Non ho capito perché questa risposta è stata approvata. Sì, è corretto seguendo la documentazione ma praticamente non funziona anche per me. Anche nella domanda è ovvio che l'utente usa la sintassi come è raccomandato su questa risposta ma ottiene comunque un errore.
Darius Miliauskas l'

54

Come sono riuscito a importare rapidamente in Object-C:

  • Definisce il modulo impostato su SÌ (sul progetto - non sulla destinazione)
  • Nome del modulo del prodotto impostato (sulla destinazione - non sul progetto)
  • In ViewController.m importa il codice rapido con:

    #import "MyProductModuleName-Swift.h"
  • Aggiungi un file rapido al tuo progetto obiettivo-c (File -> Nuovo -> Swift) e Xcode creerà l'intestazione ponte da obiettivo-c a Swift, ma questo è cruciale per farlo funzionare anche al contrario - apparentemente.

Per l'ultimo pezzo di questo puzzle grazie a Swiftoverload per avermi reso conto di aggiungere effettivamente un file Swift tramite la GUI di Xcode e non solo di trascinare e rilasciare i file swift esistenti nel mio progetto per farlo funzionare: http://nikolakirev.com/blog / con-swift-in-Objective-C-progetto


Note eccellenti Vorrei aggiungere che la destinazione del test è il suo modulo e avrà la propria intestazione denominata "<#TestTargetName #> - Swift.h" e che tutti gli spazi nei nomi delle destinazioni verranno convertiti in spazi.
Chuck Krutsinger

@ holm51 mi dispiace chiederlo, ma dov'è Define Modulee Product Module Name?
matchifang

trattini -nel nome verranno convertiti in sottolineature _pure
CyberMew

11

Usando Xcode 8.2.1 e se guardi Progetto > Impostazioni build> Nome intestazione interfaccia generata Objective-C , lì mostra solo un file di intestazione chiamato Product -Swift.h

Ciò significa che invece di importare ogni modulo separatamente dal file .m Objective-C, usando il singolo file -Swift.h, importa solo un prodotto -Swift.h che aggrega tutti i moduli Swift.

Ho riscontrato lo stesso problema cercando il modo tradizionale di importare i moduli separatamente, ma l'attuale versione di Xcode e Swift 3 lo ha modificato per utilizzare solo un'intestazione per l'importazione di tutti i moduli.


ciao peter, dove puoi trovare questo file? O è generato automaticamente da xcode? Inoltre, devi impostare il tuo podfile in modo diverso a causa di questa modifica?
Rob Norback,

@RobNorback Se non sbaglio, puoi semplicemente scrivere 'import "Product-Swift.h" nell'intestazione / file di implementazione Obj-C per vedere l'effetto, senza fare nulla in più. Assicurati che le impostazioni del tuo progetto abbiano tutte le configurazioni abilitate per il mixaggio Swift e Obj-C. Inoltre, non ho ancora riscontrato un problema con Podfile. Per favore fatemi sapere se sto vedendo le cose in modo diverso.
petershine,

Grazie, avevo passato ore a cercare di eseguire il debug di questo, e il problema era in effetti che ciascuno dei moduli del mio progetto stava generando il proprio -Swift.hfile di intestazione. Costringendoli tutti (ho 5 obiettivi) a utilizzare un file di intestazione comune ho risolto il problema per me.
Apoorv Khatreja,

@ApoorvKhatreja come li hai costretti a farlo? Hai scritto il nome del file in modo esplicito?
Amit Raz,

8

Trascorso un'ora su questo problema, seguire questi passaggi ti aiuterà a capire cosa manca:

  1. Apri la preferenza Xcode e vai alla cartella DerivedData
  2. Cerca "swift.h" nel finder
  3. Se non riesci a trovare alcun file project-swift.h, questo file non è stato generato. Di solito devi aggiungere @objc a una delle tue classi veloci e creare correttamente l'app, solo allora Xcode genererà questo file
  4. Se hai trovato il file "xxx-swift.h", assicurati che la tua dichiarazione di importazione contenga il nome corretto.

how-to-localizzare-swift-lima


Si prega di non aggiungere la stessa risposta a più domande . Rispondi a quello migliore e contrassegna il resto come duplicati, una volta guadagnata abbastanza reputazione. Se non è un duplicato, adatta il post alla domanda e contrassegna l'annullamento.
Bhargav Rao

Grazie per questo! Ho cambiato il nome di visualizzazione della mia app (non quello del target) e anche l'intestazione Swift ha cambiato nome. Questo era l'unico modo per trovare quello che stava succedendo.
Lucas P.

Grazie per aver inviato una risposta. Schermate e forma puntuale precisa mi fanno immediatamente scorrere indietro + guardato + terminata la mia ricerca ... problema risolto!
dklt

6

Ho avuto problemi con l'importazione di Swift in un progetto Objective-C. Alla fine ho guardato nella cartella Derivied Data per verificare cosa stava generando Xcode 7. Il nome del file era completamente diverso da quello che mi aspettavo.

Una volta che avevo il nome del file effettivo, l'ho importato e il progetto è stato creato.


2
Dove si trova questo file? Mi guardo intorno e non trovo nulla
Amit Raz,

5

-Swift.hdovrebbe essere creato automaticamente da Xcode se il codice Swift espone un'API tramite @objco @objcMembers[Informazioni]

Di solito appare un luogo

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

Può essere modificato da

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

Di default il valore è $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)


2

DEFINE MODULES: YES e importazione "ProjectName-Swift.h" nel file .m della classe Obj-C

Questo ha funzionato per me per accedere alle lezioni Swift in Obj-c.


3
Ma come importarlo nel file .h se ho bisogno di una classe rapida nell'intestazione objc?
Alexander Danilov,

1

Avevo affrontato lo stesso problema con il mio team quando stava lavorando al progetto usando git. Uno sviluppatore non ha aggiornato Xcode all'ultima versione (7.3) richiesta per l'ultima versione di Swift 2.2. Pertanto, il compilatore non ha riconosciuto la nuova sintassi di Swift e non è stato in grado di generare l'interfaccia per la libreria Swift (projectname-swift.h). Controlla se la versione di Xcode è l'ultima!


Nel mio caso ho affrontato il problema perché avevo deciso di posticipare la migrazione a Swift 3 offerto da Xcode. Di conseguenza Xcode non è stato in grado di creare file sorgente Swift e non ha generato le intestazioni da includere.
iutinvg,

1

Durante lo sviluppo, potrebbe esserci la possibilità che tu abbia una classe rapida che non è completamente implementata a causa della quale potrebbero esserci degli errori di sintassi. Il file di intestazione rapida sarà disponibile per l'uso solo se tutti i file rapidi sono privi di errori.

Assicurarsi che non vi siano errori di sintassi nei file rapidi e quindi provare a importare l'intestazione rapida nel file obiettivo - c


1

Importare il file di intestazione, ad es

#import "<ProjectName>-Swift.h" 

all'interno del file .h ha generato un errore, affermando:

-Swift.h 'file non trovato

e la compilazione fallì.

Invece usa:

#import "<ProjectName>-Swift.h"

all'interno del file .m e anche se appare lo stesso errore, l'esecuzione del progetto elimina comunque l'errore.

Le classi veloci sono quindi disponibili all'interno del file .m.


1

Ho affrontato il problema con il nome del progetto (target). Includeva il simbolo "-". Quindi la decisione è stata la prossima: se il nome del progetto è "Test-App", il nome della classe importata è "Test_App-Swift.h"


soluzione superba
iOS Lifee,

1

Se il nome della tua app ha un carattere speciale, usa _ per il carattere speciale.

Ad esempio, se il nome della tua app è Nome "Test App®"

Quindi è possibile importare il file rapido da "Test_App_-Swift.h".

Space e ® vengono sostituiti da _ durante l'importazione.



0

Xcode 11

Mi sono imbattuto in questo problema durante la compilazione su Xcode 11. Mi ci è voluto un po 'per capire cosa non andava, ma essenzialmente, avevo modificato l'impostazione "Nome visualizzato" nella scheda "Generale" della destinazione invece di cambiare direttamente nel Info.plistfile attraverso il Scheda "Informazioni" sulla destinazione.

Ciò ha comportato che Xcode 11.5 passasse attraverso una riscrittura / creazione di un sacco di nuovissime impostazioni di build personalizzate e modificando il nome del modulo dell'app e del prodotto .app integrato. In questo caso il nuovo nome visualizzato conteneva anche un carattere barra ( /) che potrebbe essere il motivo per cui non è stato creato (vedere la risposta di @Silversky Technology ).

Indipendentemente da ciò, ho risolto questo annullando tutte le modifiche automatiche di Xcode 11.5 al file di progetto e apportando manualmente la stessa modifica al nome visualizzato del bundle nel Info.plistfile e tutto funziona perfettamente.

Vorrei che ti dicesse che stava facendo cose del genere prima che iniziasse e lo facesse senza il tuo consenso.


0

Assicurati che la tua classe rapida abbia la dichiarazione pubblica ed estenda NSObject:

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

L'importazione dovrebbe funzionare con virgolette, non parentesi, se la classe swift è nello stesso progetto.


0

se aggiungi prima un file Swift, ricorda di aggiungere un file rapido al tuo target ..., nella colonna di sinistra

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.