Passa all'intestazione Objective-C non creata in Xcode 6


242

Di recente ho lavorato per aggiungere Swift a un progetto esistente, per provarlo in modo reale.

Dopo aver aggiunto un file sorgente Swift al progetto, non ho problemi a ottenere "Bridging Header", ovvero Objective-C su Swift.

Ma il *-Swift.hfile di intestazione che dovrebbe esporre le classi Swift contrassegnate @objco sottoclasse di classi ObjC, non si trova da nessuna parte :-(

Non vedo alcuna istruzione specifica su come realizzare l'uso della mia nuova sottoclasse, scritta in Swift, nel mio codice dell'app principale (che è ancora Objective-C).

L'app di cui sono lo sviluppatore principale ha una base di codice abbastanza grande (70.000 righe), quindi la sua transizione in una volta sola è fuori discussione.


5
Sì lo fa. Sta davvero chiedendo dove nell'IDE XCode è necessario fare qualcosa per ottenere questa Swift-> ObjC intestata creata, poiché non accade "per impostazione predefinita" quando si aggiunge il codice Swift a un progetto ObjC esistente.
David Kristensen,

5
@Popeye Non sono d'accordo. In questo caso, se stavi modificando i file e compilando dalla riga di comando, non vedresti questo problema. È l'IDE che sta eseguendo (o dovrebbe esibirsi) per tuo conto che è in questione. Ciò è probabilmente legato alla configurazione del progetto, che è sicuramente una funzione IDE
gaige,

11
@Popeye dai documenti (PDF) : quando importi il codice Swift in Objective-C, fai affidamento su un file di intestazione generato da Xcode per esporre tali file in Objective-C. (Il mio grassetto, il corsivo di Apple.) Questa è chiaramente una domanda su una funzione di Xcode che ti aiuta a usare Swift e Objective-C insieme, e tutti e tre i tag sono sicuramente appropriati.
Caleb,

3
L'ho risolto con l'aiuto di gaige e la documentazione. E non mi limito a lanciare il tag: in questo caso, il file di intestazione DOVREBBE essere creato e visibile su XCode. Non lo era, dando così errori.
David Kristensen,

3
@Popeye Non c'è nulla di sbagliato: ho copiato la citazione direttamente da pagina 46. Hai trovato un passaggio simile ma diverso che dice più o meno la stessa cosa.
Caleb,

Risposte:


165

Ora funziona.

  1. Il progetto deve avere un Nome modulo prodotto che non includa spazi.
  2. Definisce il modulo deve essere impostato su in Impostazioni build, in Imballaggio.

Finalmente funziona. Grazie a tutti per l'aiuto :-)


64
In Build Settingsunder Packaging, my Defines Moduleè impostato su Yese ho creato un Product Module Namesenza spazi. "* -Swift.h" non è generato da XCode 6. ???
Loozie,

25
Un'ulteriore nota: ho prima provato a impostare le proprietà menzionate a livello di destinazione e non ha funzionato, il file "* -Swift.h" non è stato generato. Ha funzionato quando l'ho impostato a livello di progetto.
Marcin,

22
Ho anche lo stesso problema. Ho Defines Moduleimpostato Yessia per il progetto che per il target, e Product Module Namedefinito, senza spazi , ma non riesco a generare questo file.
Craig Otis,

8
Nel caso in cui gli altri siano confusi quanto me ... Ho dovuto avere fortuna cieca qui e semplicemente importare l'intestazione, in quanto non si completerebbe automaticamente.
Shawnwall,

14
Non è possibile importare -swift nei file di intestazione (.h) solo nell'implementazione.
Zirinisp,

122

Ho avuto un problema simile e ho scoperto che puoi solo aggiungere

#import "ProductModuleName-Swift.h"

ai file obj-c .m, non ai file .h per l'intestazione dell'ombrello da trovare


2
Questo è corretto e ... e se avessi bisogno di usare una classe Swift in un'intestazione objc? Ho provato con la dichiarazione anticipata, inoltre non funziona.
Ixx

2
Spiacenti, scusa, la dichiarazione in avanti funziona. Ho dimenticato di aggiungere un punto e virgola: P
Ixx

14
Per i futuri ricercatori: nelle intestazioni fai una dichiarazione in avanti facendo @class YourSwiftClass nella parte superiore dei tuoi file .h (invece di importare l'intestazione dell'ombrello)
rogueleaderr

4
Cosa succede se devo utilizzare un enumerazione Swift in un file di intestazione?
Jakakraige,

1
Inoltre, se "#import ProductModuleName-Swift.h" si trova in qualsiasi file di intestazione, il file ProductModuleName-Swift.h non verrà generato (a partire da Xcode 7.2), quindi se fosse stato eliminato (ad esempio pulendo la build cartella) quindi vedrai messaggi di errore ovunque il file venga importato, anche per i file .m, aggiungendo alla confusione.
rene

59

Ho scoperto che dovevo correggere tutti gli errori di compilazione prima che generasse il file.

Il problema per me era che si trattava di un problema pollo / uovo, in quanto non vedevo errori di compilazione fino a quando non avevo effettivamente commentato l' #importaffermazione:

//#import "ProductModuleName-Swift.h"

che ha rivelato un sacco di altri errori nel mio codice Swift.

Una volta risolti questi nuovi errori e ottenuto la creazione corretta del sorgente, ho decommentato il #importbingo! L'intestazione è stata creata e importata correttamente :)


Grazie, questo è esattamente ciò che mi stava trattenendo. Dopo aver corretto gli errori di compilazione rapidi, ero a posto. (Xcode versione 6.1.1)
Rick Roberts

10
Questo è un ottimo punto e un buon motivo per attivare l'impostazione "continua a costruire dopo errori" in Xcode.
Kendall Helmstetter Gelner,

Questo è esattamente anche il mio caso: mancava -Swift-h dopo le stesse modifiche al codice sorgente rapido
Giorgio Calzolato,

3
dopo aver visto il problema pollo / uovo, mi rendo conto del mio problema, Buona analogia
d0ye,

Questo problema mi tornava sempre (Xcode10) e ho appena interpretato Xcode come un bug. Questa era la risposta
SumakuTension

44

Se sei come me probabilmente hai sbagliato il nome dell'intestazione. Dopo aver scosso la testa per un po ', ho cercato il file in DerivedData e sicuramente è lì. Sulla mia configurazione (credo che usando la cartella dei dati derivati ​​standard):

cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'

Lo troverò. Se nulla in quella cartella corrisponde, Xcode non lo sta generando.

Sto usando Xcode versione 6.2 (6C86e)


Questo è stato per me. Ho pensato che il completamento automatico rileverà che ho appena pensato che non fosse lì. Vedendo nella directory chiarito le cose.
Sarà il

A volte vedere è credere. Non sono stato in grado di far funzionare le cose fino a quando non ho seguito la risposta consigliata e quindi ho usato questi passaggi per trovare l'intestazione generata che, con mia sorpresa, è stata postfissa con -Swift.he non il nome del mio vero file Swift. Grazie!
Josh Habdas,

Grazie! Mi ha risparmiato un sacco di tempo
estemendoza il

43

Se il nome del modulo del progetto contiene spazi, è necessario sostituire gli spazi con un carattere di sottolineatura.

Ad esempio, se il nome del tuo progetto è "Progetto personale", utilizzeresti:

#import "My_Project-Swift.h"


12
Se il nome del modulo del progetto contiene trattini, devono essere sostituiti con un trattino basso. Quindi, se il nome del tuo progetto è "My-Project", usa #import "My_Project.h"
Jeff Ames,

6
Inoltre, se il nome del modulo di progetto inizia con un numero, è necessario sostituirlo con un carattere di sottolineatura. "1st Project" sarà "_st_Project-Swift.h"
Danation,

31

* L'unica cosa importante è: *

per utilizzare il "Nome modulo prodotto" definito nella destinazione, seguito da -Swift.h

#import <Product Module Name>-Swift.h

// in each ObjectiveC .m file having to use swift classes
// no matter in which swift files these classes sit.

Indipendentemente se il parametro "Definisce modulo" è impostato su Sì o No o se il progetto "Nome modulo prodotto" non è impostato.

Promemoria: le classi Swift devono derivare da NSObject o sono state taggate con l'attributo @objc per essere esposte a ObjectiveC / Foundation || Cacao ...


1
È vero: non c'è bisogno di "Define Module" in Project o in Target
Giorgio Calzolato,

25

Volevo aggiungere un'altra ragione per cui potresti trovare un problema con questo: stavo creando un framework che mescolava il codice Swift e Objective-C. Non sono stato in grado di importare le classi Swift al di fuori del framework: ho controllato il file -Swift.h ed è stato generato ma era vuoto.

Il problema si è rivelato molto, molto semplice: non avevo dichiarato pubblica nessuna delle mie classi Swift! Non appena ho aggiunto la parola chiave pubblica alle classi, sono stato in grado di usarle dalle classi all'interno e all'esterno del framework.

Inoltre, all'interno del framework (all'interno dei file .m solo come menzionato da un'altra risposta) ho dovuto importare il file -Swift.h come:

#import <FrameworkName/FrameworkName-Swift.h>

2
In Framework noto anche che per usare le classi Swift, dovrebbero essere ereditate da NSObject (anche @objc non aiuterà) e tutti i metodi / proprietà dovrebbero essere pubblici.
dmitrynikolaev,

3
Almeno nell'attuale pre-release di XCode 7, fino a quando non si eredita da NSObject non saranno disponibili nell'intestazione rapida generata.
dmitrynikolaev,

Il 100% NON ha risolto il mio problema. OGNI soluzione è "rendere pubbliche le tue classi". L'ho fatto. Periodo. NON rivela ancora le classi Swift nei progetti che utilizzano il framework.
datWooWoo,

@lespommes, dovresti scrivere una domanda e presentare un progetto di esempio da qualche parte che mostri il problema, qualcuno potrebbe capire cosa sta succedendo ... Ho appena dato la mia risposta come una possibile soluzione, perché è l'errore di visibilità che commetto di più frequentemente.
Kendall Helmstetter Gelner,

2
Oh sì, il tuo suggerimento con l'importazione ha fatto finalmente il trucco per me! Molte grazie!
Endowzoner,

14

Ho avuto lo stesso problema. Sembra che devi modificare le impostazioni (Definisce il modulo e il nome del modulo del prodotto) prima di aggiungere il tuo primo file Swift.

Se lo fai in seguito, il file "* -Swift.h" non verrà generato per questo progetto anche se aggiungi altri file Swift o elimini il file Swift e ne crei uno nuovo.


Non sono sicuro che sia vero. Non ho deciso di abilitare 'Defines Module' fino a quando non ho creato molti file rapidi e sono stato in grado di ottenere un -Swift.h bene.
Michael Peterson,

Sono davvero rattristato nel riferire che questo è esattamente il problema che ho avuto :( ho dovuto eliminare il mio .swift e aggiungerlo di nuovo, e poi tutto ha funzionato.
StuFF mc

2
E adesso? Sono nel bel mezzo di cambiare sia il codice Swift che ObjC. Il mio progetto Swift.h non si aggiorna. Ho anche provato a eliminare il file di intestazione.
Suhail Bhat,

2
Ho dovuto scrivere questo, dev.iachieved.it/iachievedit/?p=980 . Il consiglio sull'aggiornamento delle impostazioni di compilazione prima di aggiungere i file Swift è stato fondamentale per me.
Joe,

Questo significa che dovrei ricreare il progetto e aggiungere nuovamente tutto se non lo facessi? Non importa quello che faccio, non riesco a ottenere il file * -Swift.h da generare.
kgreenek,

13

Consentimi di condividere le mie esperienze cercando di usare Swift in un vecchio progetto objc. Non ho avuto per impostare Defines modulea YES.

Nel mio caso, avevo bisogno di assicurarmi manualmente che ci fosse un'intestazione Bridging objc. Nelle impostazioni della mia build era presente solo il nome dell'intestazione dell'interfaccia generata.

Intestazione ponte mancante

Ciò ha portato alla generazione di un file MyApp-Swift.h, ma senza alcuna traccia delle mie classi Swift.

La documentazione di Apple afferma che ti verrà richiesto di creare un'intestazione ponte quando aggiungi il tuo primo file rapido. Beh, non lo ero. Ho aggiunto manualmente aMyApp-Bridging-header.h file e l' indicato nel campo "Intestazione ponte Objective-C". Ciò ha reso il mio file MyApp-Swift.h popolato con le mie classi Swift.

Documenti: importazione di Swift in Objective-C


sì, per qualsiasi motivo il mio file ObjC Swift.h è stato generato con le intestazioni della classe Swift solo dopo che ho aggiunto il file di intestazione ponte vuoto al progetto!
Andrew,

Anch'io. Il mio codice Swift non è stato importato nel file * -Swift.h generato finché non ho aggiunto un file di intestazione ponte Objective-C vuoto.
Nik,

12

Ecco un'altra variante del moduleName-Swift.h che non viene generata.

Ho deciso di includere i grafici IOS nel mio progetto ma non volevo mescolare i sorgenti nella stessa directory, quindi ho posizionato la cartella Progetto grafici accanto alla cartella del progetto del mio codice. Ho trascinato il progetto Charts nella barra di navigazione del mio progetto e ho incluso il framework nell'elenco Binaries incorporati del target del mio progetto nelle impostazioni generali del progetto e ho impostato l' opzione Codice contenuto incorporato con codice Swift su Sì nella scheda Impostazioni di costruzione del mio progetto nella sezione Opzioni di costruzione .

Il file moduleName-Swift.h del mio progetto non verrebbe mai generato, indipendentemente dagli altri switch o impostazioni suggeriti qui. Infine, usando il metodo di Lou Z per cercare i file -Swift.h, ho visto che un file Charts-Swift.h veniva generato in profondità nella directory Build xcode del mio progetto in Charts.framework / Headers /

La soluzione per utilizzare il pacchetto Swift ios-chart di Daniel Gindi senza includere il codice nella directory dei sorgenti del mio progetto è stata quella di aggiungere:

#import "Charts/Charts-Swift.h"

Ai moduli che tracciano i dati del mio progetto.


È possibile cambiare / personalizzare la descrizione comandi nei grafici IOS? se sì allora puoi fare un esempio?
Amit Chauhan il

12

Il nome del file è sempre preceduto dal nome del target . È indicato come nome del prodotto, ma praticamente è il nome di destinazione. Quindi, se vuoi che si costruisca per un nuovo target, sii pronto ad aspettarti un that_target-Swift.hfile.

Un modo per gestirlo è

  1. Aggiungi un preprocessore per ciascun target che è il nome del target stesso (senza spazi). Ex. MY_TARGET=1. Aggiungi questo in Impostazioni progetto-> Impostazioni di costruzione-> Macro preprocessore per ciascuno dei tuoi obiettivi.
  2. Se stai utilizzando un file PCH,

Aggiungi queste righe nel file PCH

#if MY_TARGET==1
#include "My_Target-Swift.h"
#elif THAT_TARGET==1
#include "That_Target-Swift.h" 
#endif

Il vantaggio di utilizzare il file PCH è che non è necessario includere le intestazioni ovunque.

  1. Se non si utilizza un file PCH, è sufficiente aggiungere queste stesse righe in una singola intestazione e includere quella intestazione ovunque sia necessario utilizzare le classi rapide.

Questo dovrebbe funzionare bene.


Mi piace molto usare questa soluzione piuttosto che importare l'intestazione direttamente nella tua fonte. Ho una struttura di progetto complicata in cui lo stesso codice sorgente viene utilizzato da più obiettivi / progetti. Questo evita di aggiungere un'istruzione disordinata #if #else in tutto il mio codice. Grazie per la risposta!
Ryan,

Questo mi ha salvato la giornata. Ho inserito le 5 righe di codice in un file "Something-Swift-Headers.h" (con includeal suo interno). Quindi importare questo nuovo file da dove ne ho bisogno. Preferisco non inserirlo nel PCH o in alcun file .h per evitare dipendenze cicliche e utilizzare l'intestazione di convenienza nei file .m.
ctietze,

Questo è sbagliato sotto molti aspetti. In primo luogo, i .pchfile sono fortemente scoraggiati . In secondo luogo, il nome del file contiene il nome del prodotto e NON il nome di destinazione. Potrebbe essere una coincidenza che sia lo stesso, ma ha usato il nome del prodotto!
Iulian Onofrei il

10

Se Xcode sta effettivamente generando la tua intestazione -Swift.h (nel profondo di DerivedData) ma non si riferisce alle tue classi Swift, assicurati di avere anche un'intestazione a ponte definita. Il modo in cui ho letto i documenti implicava che avevo bisogno solo di quello per chiamare Objective-C da Swift, ma sembra essere necessario anche per chiamare Swift da Objective-C.

Vedi la mia risposta: https://stackoverflow.com/a/27972946/337392

EDIT: È a causa di modificatori di accesso pubblico vs. interno, come ho scoperto alla fine spiegato nei documenti di Apple: -

Per impostazione predefinita, l'intestazione generata contiene interfacce per le dichiarazioni Swift contrassegnate con il modificatore pubblico. Contiene anche quelli contrassegnati con il modificatore interno se la destinazione dell'app ha un'intestazione bridge Objective-C.


Sì, questo mi ha davvero aiutato. Non lo sapevo. Ho pensato che fosse necessario solo per il caso d'uso Obj-C di Swift.
nodepond

Felice di aiutare. Ho modificato la risposta perché da allora ho scoperto il motivo di questo comportamento.
Echelon,

7

Secondo ciò che molte persone hanno qui, ma aggiungendo una schermata pertinente. Il codice Swift e Obj-C possono certamente convivere. Non è un gioco tutto o nessuno.

Per accedere ai file Swift nel tuo Objective-C, tutto ciò che devi fare è aggiungere questa chiamata al tuo file Obj-C (nel file .m / implementazione):

#import "{product_module_name}-Swift.h"

(Dove {product_module_name} rappresenta il nome del modulo del prodotto del progetto). Invece di provare a indovinare il nome del tuo modulo di prodotto o di capire casi angolari con spazi e caratteri speciali, vai alla scheda delle impostazioni di costruzione nel progetto e digita "nome del modulo di prodotto" - l'ispettore ti rivelerà il tuo. Il mio era qualcosa che non mi aspettavo fosse. Dai un'occhiata a questa schermata se sei confuso.

inserisci qui la descrizione dell'immagine

E per far funzionare il codice Obj-c in Swift, devi solo aggiungere un file di intestazione ponte e importare lì le relative intestazioni Obj-C.


1
Non dovrebbe essere #import?
Iulian Onofrei il

Diciamo che il mio nome del progetto è ABC, quindi "ABC-Swift.h", deve esistere nel mio progetto giusto? Non riesco a trovarlo Hai bisogno di crearlo manualmente? Non sto creando alcun file rapido da solo, incluso solo un baccello di cacao che è scritto in rapido.
nr5

L'intestazione Bridging (nel tuo caso, ABC-Swift.h) non viene creata automaticamente. Quando si tenta di creare il primo file Swift in un progetto Obj-C, Xcode normalmente richiede di aggiungerne uno. Puoi anche creare un'intestazione Bridging da solo come mostrato qui (control + f per 'intestazione bridging'): developer.apple.com/library/content/documentation/Swift/…
Brian Sachetta,

5

La cosa più importante è che questo file è invisibile !!! Almeno è in Xcode6 beta5. Non ci sarà un file simile chiamato "YourModule-Swift.h" nell'area di lavoro. Assicurati di avere il nome del modulo e definisce il modulo impostato su yes, e usalo nella tua classe Objective-C.


5

Ok, ecco tutte le cose di cui hai veramente bisogno!

1.Rimuovi tutti i file rapidi che hai aggiunto e compila il codice, senza errori.

----------

inserisci qui la descrizione dell'immagine

----------

2. Vai alle impostazioni di compilazione "Progetti" e imposta il nome del modulo del prodotto. Il progetto deve avere un Nome modulo prodotto che non includa spazi.

----------

inserisci qui la descrizione dell'immagine

----------

3.Definisce il modulo deve essere impostato su Sì in Impostazioni di costruzione, in Imballaggio, nel progetto e non come destinazione!

----------

inserisci qui la descrizione dell'immagine

----------

4.Ora crea un file rapido o un controller di visualizzazione, in file-> newFile->

----------

inserisci qui la descrizione dell'immagine

----------

Chiederà di creare un'intestazione ponte, consentendogli di crearne uno. Se l'hai rifiutato una volta, dovrai aggiungere manualmente un -Bridging-Header.h

5.Aggiungi @objc nel controller, per dire al compilatore che esiste un file rapido, che deve essere esposto a ObjectiveC

----------

inserisci qui la descrizione dell'immagine

----------

6. Costruisci il progetto e importa #import "-Swift.h" in uno dei controller dell'obiettivo C, e funzionerà! Puoi Comando-clic su di esso per vedere il file reale!

----------

inserisci qui la descrizione dell'immagine

----------

Spero che questo ti aiuti!


>> Puoi fare clic su di esso per vedere il file reale! È fantastico
Jagan,

4

Questa risposta risolve il caso d'uso in cui potresti già avere un codice Objective-C che chiama le classi Swift e quindi inizi a ricevere questo errore.

Come risolvere il problema

I seguenti passaggi alla fine hanno risolto tutti i problemi per me. Ho letto sopra qualcuno che menziona il "pollo e l'uovo" ed è esattamente questo concetto che mi ha portato a questa procedura. Questo processo esplicito mostra che è necessario rimuovere qualsiasi codice Objective-C che fa riferimento alle classi Swift fino a quando non viene generata l'intestazione.

  1. Commenta l'istruzione #import "ProductModuleName-Swift.h" nel file di implementazione di Objective-C
  2. Commenta qualsiasi riferimento nel file di implementazione Objective-C a Classi Swift
  3. Pulisci e costruisci
  4. Risolvi tutti gli errori / avvisi
  5. Rimuovere il commento sull'istruzione #import "ProductModuleName-Swift.h"
  6. Pulisci e costruisci (con successo o correggi eventuali errori rimanenti, verifica che non stai facendo riferimento a nessuna classe Swift in Objective-C a questo punto . In tal caso, commentali temporaneamente)
  7. Verificare che "ProductModuleName-Swift.h" sia generato da Cmd -Clic sul nome della classe dell'istruzione #import "ProductModuleName-Swift.h"
  8. Rimuovere il commento sul codice che fa riferimento alle classi Swift nel file di implementazione Objective-C.
  9. Clean & Build normalmente (dovrebbe essere generato "ProductModuleName-Swift.h" e il codice Objective-C che fa riferimento alle classi Swift può essere utilizzato normalmente)

Nota Bene: le risposte sulla modifica degli spazi in caratteri di sottolineatura e il modulo Definisci su SÌ come indicato sopra si applicano ancora quando si esegue questo processo, così come le regole specificate nella documentazione di Apple .

Colmare il percorso dell'intestazione

In un errore, il file ProductModuleName-Bridging-Header.h non è stato trovato durante il processo di generazione. Questo fatto ha generato un errore

<sconosciuto>: 0: errore: intestazione ponte '/Users/Shared/Working/abc/abc-Bridging-Header.h' non esiste

Un'analisi più approfondita dell'errore ha indicato che il file non sarebbe mai esistito nella posizione descritta perché si trovava effettivamente in ( un percorso errato )

'/Users/Shared/Working/abc/abc/abc-Bridging-Header.h'. una rapida ricerca del target / progetti crea le impostazioni per effettuare la correzione manualmente e il file abc-Swift.h è stato nuovamente generato automaticamente.

accumuli impostazioni


1
Cosa succede se il tuo progetto è così grande che non è pratico commentare tutti i riferimenti del codice rapido nell'obiettivo c?
Andrew Morris,

3

Devi importare un'intestazione nelle classi Objective-C, che è:

#import “ProductModuleName-Swift.h”

Viene generato automaticamente, sul riferimento dice "Tutti i file Swift nella destinazione saranno visibili nei file .m Objective-C contenenti questa istruzione di importazione."


24
Ma, quando lo faccio, ricevo un errore di compilazione, AppName-Swift.h non esiste. Considerando che, AppName-Bridging-Header.h esiste.
David Kristensen,

5
@DavidKristensen: hai trovato la soluzione? Come ho bloccato con lo stesso problema
BaSha

2

Non viene creato un file effettivo nel progetto ([ProductModuleName] -Swift.h). Cmd + Fai clic sull'importazione o lo genera al volo (e in memoria) in modo da poter vedere come viene fatto il collegamento, o apre un file da qualche parte in una directory della cache Xcode, ma non è nella directory del progetto.

Devi impostare Definisci il progetto prop Modulo (nelle impostazioni di costruzione del target) su e se il nome del tuo modulo ha spazi o trattini - usa _ in tutte le importazioni del file [ProductModuleName] -Swift.h.

Puoi importarlo in tutti i file .h e .m in cui usi tipi rapidi o puoi importarlo in .pch.

Quindi se il mio modulo (progetto) è chiamato "Test Project", lo importerei così, nel file .pch del mio progetto (proprio lì):

#import "Test_Project-Swift.h"

2

Solo un avvertimento per chiunque abbia usato "." nel nome del progetto. Xcode sostituirà il "." con un trattino basso "_" per la versione Swift del file di intestazione ponte. Stranamente il Bridging-Header.h che viene generato non sostituisce i periodi con caratteri di sottolineatura.

Ad esempio, un progetto con il nome My.Project avrebbe i seguenti nomi di file di intestazione Bridging.

Bridging-Header.h (Generato automaticamente)

My.Project-Bridging-header.h

Swift.h

My_Project.h

Spero che questo aiuti chiunque abbia usato un ciclo mestruale ed è rimasto bloccato come me. Questo file è disponibile nella seguente posizione.

Macintosh HD / Users / user /Library/Developer/Xcode/DerivedData/My.Project-fntdulwpbhbbzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Project.build/DerivedSources

Stai attento,

Jon


2

Il progetto deve avere un Nome modulo senza spazi. Definisce il modulo deve essere impostato su Sì in Impostazioni build, in Imballaggio. ha commentato la dichiarazione #import:

Se continui ad avere errori nell'importazione di "ProductModuleName-Swift.h", allora

// # import "ProductModuleName-Swift.h"

che ha rivelato un sacco di altri errori nel mio codice Swift.

Una volta risolti questi nuovi errori e ottenuto la creazione corretta della fonte, ho decommentato #import e bingo! L'intestazione è stata creata e importata correttamente :)


Il mio problema era che avevo anche errori nel mio codice Swift, ma non lo sapevo fino a quando non ho decommentato il file -Swift.h. Grazie!
Sarà il

1

Ho trovato un trucco che funziona sempre su di me.

  1. Crea il tuo #import "ProductModuleName-Swift.h" nel file appDelegate.h e nel file ProductName-Prefix.pch. Se non lo hai in xcode 6 puoi crearlo in questo modo Perché ProjectName-Prefix.pch non viene creato automaticamente in Xcode 6?
  2. Comando + MAIUSC + K per pulire il codice, se si riceve un errore relativo a "ProductModuleName-Swift.h", eliminarlo dal file appDelegate.h.
  3. Pulisci di nuovo il tuo codice. Ora tutto funzionerà come un fascino
  4. Se ricevi di nuovo un errore su "ProductModuleName-Swift.h", ora crea nuovamente nel file appDelegate.h e ripulisci il codice.

Fai questo lavoro (elimina e crea il "ProductModuleName-Swift.h" dal file appDelegate.h e pulisci il tuo codice) ogni volta che ricevi questo errore per silenziarlo.


1

Ho trovato questa soluzione

  • Crea SwiftBridge.h
  • inserisci #import "ProductModuleName-Swift.h"
  • Rendi pubblico questo file .h (importante) Seleziona il file -> In Mostra il file Impostazioni (barra di destra) -> Rendi pubblico

Ora puoi

#import "SwiftBridge.h"

anziché ProductModuleName-Swift.h

Questa è una soluzione alternativa, per la prossima versione di Xcode penso che questo problema sarà risolto. In bocca al lupo


Non funziona L'ho appena provato. La riga #import “ProductModuleName-Swift.h”presenta solo un errore nel file SwiftBridge.h anziché nel file di codice Objective-C originale.
Supertecnoboff,

1

Stavo facendo fatica a determinare il nome del mio modulo / obiettivo-c dell'importazione delle intestazioni di Swift. Ho letto molti articoli anche qui.

Ma la risposta definitiva per il nome del tuo progetto con tutti i suoi caratteri speciali inclusi (sia esso '.' O un numero o uno spazio) - puoi trovare il testo che funzionerà per te nel " Nome modulo prodotto " sotto le Impostazioni di costruzione del target .

Ad esempio il mio nome di destinazione è iniziato con un numero - "1mg" e il campo sopra menzionato mostrava "_mg" come nome del mio modulo.

così ho usato #import "_mg-Swift.h" e ha funzionato.

Il nome del modulo del prodotto nelle impostazioni di costruzione della destinazione fornisce il nome del modulo corretto che funzionerà per il tuo progetto


Se riesci a modificare in un collegamento a uno screenshot, potrei modificare la tua risposta per visualizzarla per te.
SuperBiasedMan,

1

Nel mio caso ho dovuto impostare la destinazione di distribuzione almeno su "OS X 10.9" e l' -Swift.hintestazione è stata generata automaticamente. Tenere presente che è possibile ricevere molti avvisi di deprecazione quando si modifica la versione di destinazione della distribuzione, in particolare quando si dispone di una base di codice Obiettivo C più vecchia e molto grande. Nel nostro caso abbiamo avuto anche molto lavoro da fare nei file XIB e nelle classi di visualizzazione.


2
Per gli altri - cerca nelle Impostazioni di costruzione per il tuo obiettivo, ottieni il nome esatto "MyProject-Swift.h" - questo è ciò che devi includere come "#include" MyProject-Swift.h "nei file Objc appropriati. BTW, questo la risposta mi ha davvero aiutato - lavorare per convertire alcuni vecchi open source di ObjectiveC
David H,

0

Se in precedenza sei stato in grado di costruire un progetto, senza problemi relativi “ProductModuleName-Swift.h” not foundall'errore, e ora stai riscontrando nuovamente quegli errori cattivi, il motivo potrebbe risiedere nelle tue recenti modifiche.

Per me questo era dovuto a una .swiftcodifica dei file (accidentale) errata . Annullare le modifiche e riportare manualmente indietro, fa il lavoro.


0

Questo può essere un punto ovvio (forse troppo ovvio), ma devi avere almeno un file rapido nel progetto per generare l'intestazione. Se stai scrivendo codice caldaia o codice di configurazione con l'intenzione di scrivere rapidamente in seguito l'importazione non funzionerà.


0

Ho dovuto eliminare il codice rapido di WatchOS2 dal mio progetto Obiettivo C. E solo dopo XCode si è offerto di generare -Swift.h


0

Ho avuto un problema simile, ma il mio progetto si stava compilando prima e improvvisamente ho avuto un errore dopo alcune modifiche al codice dei file. Mi ci è voluto del tempo per capire perché visualizzo l'errore "File not found" per il file myproject-swift.h. Le modifiche al codice che avevo fatto avevano degli errori. Xcode non ha puntato messo quegli errori invece mostrando sempre "Errore file non trovato". Quindi ho ottenuto una copia del codice della versione precedente e ho confrontato con il nuovo codice e ho unito il file uno per uno. Dopo ogni unione di file ha rispettato il progetto per trovare l'errore. Quindi la linea di fondo è se hai un errore nel tuo codice Xcode potrebbe semplicemente visualizzare 'errore file not found' per il file myproject-swift.h. Molto probabilmente hai un errore di compilazione nel tuo progetto. Elimina quegli errori e funzionerà.


0

Se stai usando qualcosa come Cocoapods (e stai lavorando fuori dall'area di lavoro piuttosto che dal progetto) prova ad aprire il progetto e costruirlo prima di aprire l'area di lavoro e l'edificio. YMMV.


0

A volte è sufficiente annullare l'impostazione e quindi impostare nuovamente l'appartenenza di destinazione sul file obj-c .m.

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.