Swift to Objective-C-Header wurde in Xcode 6 nicht erstellt


242

Ich habe kürzlich daran gearbeitet, Swift zu einem bestehenden Projekt hinzuzufügen, um es auf reale Weise auszuprobieren.

Beim Hinzufügen einer Swift-Quelldatei zum Projekt habe ich keine Probleme damit, den "Bridging Header", dh Objective-C, an Swift zu senden.

Die *-Swift.hHeader-Datei, die Swift-Klassen entweder als markierte @objcoder als Unterklassen von ObjC-Klassen verfügbar machen soll , ist jedoch nirgends zu finden :-(

Ich sehe keine spezifischen Anweisungen, wie ich die Verwendung meiner in Swift geschriebenen neuen Unterklasse in meinem Haupt-App-Code (der immer noch Objective-C ist) durchführen kann.

Die App, deren Hauptentwickler ich bin, hat eine ziemlich große Codebasis (70.000 Zeilen), sodass ein Übergang auf einmal nicht in Frage kommt.


5
Ja tut es. Es wird wirklich gefragt, wo in der XCode-IDE etwas getan werden muss, um diese Swift-> ObjC-Überschrift zu erstellen, da dies nicht "standardmäßig" geschieht, wenn Swift-Code zu einem vorhandenen ObjC-Projekt hinzugefügt wird.
David Kristensen

5
@ Popeye Ich bin anderer Meinung. In diesem Fall würde dieses Problem nicht auftreten, wenn Sie die Dateien bearbeiten und über die Befehlszeile kompilieren würden. Es geht um die IDE, die in Ihrem Namen ausgeführt wird (oder ausgeführt werden soll). Dies hängt höchstwahrscheinlich mit dem Projekt-Setup zusammen, das definitiv eine IDE-Funktion ist
gaige

11
@Popeye Aus den Dokumenten (PDF) : Wenn Sie Swift-Code in Objective-C importieren, verlassen Sie sich auf eine von Xcode generierte Header- Datei, um diese Dateien für Objective-C verfügbar zu machen . (Meine Fettschrift, Apples Kursivschrift.) Dies ist eindeutig eine Frage zu einer Funktion von Xcode, mit der Sie Swift und Objective-C zusammen verwenden können, und alle drei Tags sind sicherlich angemessen.
Caleb

3
Ich habe es mit Hilfe von Gaige und der Dokumentation gelöst. Und ich werfe das Tag nicht einfach herum: In diesem Fall sollte die Header-Datei von XCode erstellt und für XCode sichtbar sein. Es war nicht so, was zu Fehlern führte.
David Kristensen

3
@Popeye Es gibt nichts Falsches - ich habe das Zitat direkt von Seite 46 kopiert. Sie haben eine ähnliche, aber unterschiedliche Passage gefunden, die mehr oder weniger dasselbe sagt.
Caleb

Antworten:


165

Jetzt gehts.

  1. Das Projekt muss einen Produktmodulnamen haben, der keine Leerzeichen enthält.
  2. Defines Module muss in den Build-Einstellungen unter Packaging auf Yes gesetzt sein .

Endlich funktioniert. Vielen Dank an alle für die Hilfe :-)


64
In Build Settingsunter Packagingist mein Defines Moduleeingestellt Yesund ich habe ein Product Module Nameohne Leerzeichen erstellt. Die "* -Swift.h" wird nicht von XCode 6 generiert. ???
Loozie

25
Ein zusätzlicher Hinweis: Ich habe zuerst versucht, die genannten Eigenschaften auf der Zielebene festzulegen, und es hat nicht funktioniert, die Datei "* -Swift.h" wurde nicht generiert. Es hat funktioniert, als ich es auf Projektebene eingestellt habe.
Marcin

22
Ich habe auch das gleiche Problem. Ich habe Defines Moduleauf Yessowohl für Projekt- und Ziel, und eine Product Module Namedefinierte, mit ohne Leerzeichen , aber ich kann nicht scheinen , diese Datei erzeugt werden.
Craig Otis

8
Nur für den Fall, dass andere so verwirrt sind wie ich ... Ich musste hier blindes Glück haben und einfach den Header importieren, da er sich nicht automatisch vervollständigen würde.
Shawnwall

14
Sie können -swift nicht nur in der Implementierung in Header-Dateien (.h) importieren.
Zirinisp

122

Ich hatte ein ähnliches Problem und stellte fest, dass Sie nur hinzufügen können

#import "ProductModuleName-Swift.h"

zu obj-c .m-Dateien, nicht zu .h-Dateien für den zu findenden Umbrella-Header


2
Das ist richtig und ... was ist, wenn ich eine Swift-Klasse in einem Objekt-Header verwenden muss? Ich habe es mit Vorwärtsdeklaration versucht, es funktioniert auch nicht.
Ixx

2
Whops, sorry, Forward Declaration funktioniert. Ich habe vergessen, ein Semikolon hinzuzufügen: P
Ixx

14
Für zukünftige Suchende: Führen Sie in Ihren Headern eine Deklaration durch, indem Sie @class YourSwiftClass oben in Ihren .h-Dateien ausführen (anstatt den Umbrella-Header zu importieren)
rogueleaderr

4
Was ist, wenn ich eine Swift-Enumeration in einer Header-Datei verwenden muss?
Jakecraige

1
Wenn sich "#import ProductModuleName-Swift.h" in einer Header-Datei befindet, wird die ProductModuleName-Swift.h-Datei überhaupt nicht generiert (ab Xcode 7.2), wenn sie gelöscht wurde (z. B. durch Bereinigen des Builds) Ordner), dann werden überall Fehlermeldungen angezeigt, dass die Datei importiert wird, auch für .m-Dateien, was die Verwirrung noch verstärkt.
Rene

59

Ich stellte fest, dass ich alle Build-Fehler beheben musste , bevor die Datei generiert wurde.

Das Problem für mich war, dass es sich um ein Henne / Ei-Problem handelte, da ich keine Build-Fehler sah, bis ich die #importAussage tatsächlich auskommentiert hatte :

//#import "ProductModuleName-Swift.h"

was eine Reihe anderer Fehler in meinem Swift-Code enthüllte.

Nachdem ich diese neuen Fehler behoben und das Quellgebäude erfolgreich erstellt hatte, habe ich das #importund Bingo auskommentiert! Der Header wurde erstellt und korrekt importiert :)


Danke, genau das hat mich aufgehalten. Nachdem ich die schnellen Build-Fehler behoben hatte, konnte ich loslegen. (Xcode Version 6.1.1)
Rick Roberts

10
Dies ist ein guter Punkt und ein guter Grund, die Einstellung "Nach Fehlern weiterbauen" in Xcode zu aktivieren.
Kendall Helmstetter Gelner

Das ist genau mein Fall auch: Fehlende -Swift-h geschah nach den gleichen Änderungen im schnellen Quellcode
Giorgio Calzolato

3
Nachdem ich das
Henne

Dieses Problem kehrte immer wieder zu mir zurück (Xcode10) und ich interpretierte Xcode nur als fehlerhaft. Dies war jedoch die Antwort
SumakuTension

44

Wenn Sie wie ich sind, haben Sie wahrscheinlich den falschen Headernamen. Nachdem ich mir eine Weile den Kopf geschlagen hatte, suchte ich in DerivedData nach der Datei und sicher war sie da. Bei meinem Setup (unter Verwendung des Standardordners für abgeleitete Daten, glaube ich):

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

Wird es finden. Wenn nichts in diesem Ordner übereinstimmt, generiert Xcode es nicht.

Ich verwende Xcode Version 6.2 (6C86e)


Das hat es für mich getan. Ich habe gedacht, dass Autocomplete es aufnehmen wird, dass ich nur angenommen habe, dass es nicht da ist. Das Sehen im Verzeichnis räumte die Dinge auf.
Will

Manchmal glaubt das Sehen. Ich konnte die Dinge erst zum Laufen bringen, als ich der empfohlenen Antwort gefolgt war, und dann diese Schritte verwendet, um den generierten Header zu finden, der zu meiner Überraschung mit -Swift.hund nicht mit dem Namen meiner tatsächlichen Swift-Datei nachfixiert wurde . Danke dir!
Josh Habdas

Vielen Dank!
Hat

43

Wenn der Name Ihres Projektmoduls Leerzeichen enthält, müssen Sie die Leerzeichen durch einen Unterstrich ersetzen.

Wenn Ihr Projektname beispielsweise "Mein Projekt" lautet, würden Sie Folgendes verwenden:

#import "My_Project-Swift.h"


12
Wenn der Name Ihres Projektmoduls Bindestriche enthält, sollten diese auch durch einen Unterstrich ersetzt werden. Wenn Ihr Projektname also "Mein Projekt" ist, verwenden Sie #import "My_Project.h"
Jeff Ames

6
Wenn der Name Ihres Projektmoduls mit einer Nummer beginnt, sollte er auch durch einen Unterstrich ersetzt werden. "1st Project" wird "_st_Project-Swift.h" sein
Danation

31

* Das einzig Wichtige ist: *

um den definierten "Produktmodulnamen" im Ziel zu verwenden, gefolgt von -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.

Egal, ob der Parameter "Defines Module" auf Yes oder No gesetzt ist oder ob das Projekt "Product Module Name" nicht gesetzt ist.

Erinnerung: Swift-Klassen müssen von NSObject abgeleitet oder mit dem Attribut @objc versehen sein, um für ObjectiveC / Foundation || verfügbar gemacht zu werden Kakao ...


1
Das stimmt: Keine Notwendigkeit für "Modul definieren" im Projekt oder im Ziel
Giorgio Calzolato

25

Ich wollte noch einen Grund hinzufügen, warum Sie möglicherweise ein Problem damit finden - ich habe ein Framework erstellt, das Swift- und Objective-C-Code mischt. Ich konnte die Swift-Klassen nicht außerhalb des Frameworks importieren. Ich habe nach der Datei -Swift.h gesucht und sie wurde generiert, war aber leer.

Das Problem stellte sich als sehr, sehr einfach heraus - ich hatte keine meiner Swift-Klassen für öffentlich erklärt! Sobald ich den Klassen das öffentliche Schlüsselwort hinzugefügt hatte, konnte ich sie aus Klassen innerhalb und außerhalb des Frameworks verwenden.

Bemerkenswert ist auch, dass ich innerhalb des Frameworks (innerhalb von .m-Dateien nur als eine andere Antwort erwähnt) die -Swift.h-Datei importieren musste als:

#import <FrameworkName/FrameworkName-Swift.h>

2
In Framework stelle ich außerdem fest, dass Swift-Klassen von NSObject geerbt werden sollten (auch @objc hilft nicht) und alle Methoden / Eigenschaften öffentlich sein sollten.
Dmitrynikolaev

3
Zumindest in der aktuellen XCode 7-Vorabversion sind sie im generierten schnellen Header nicht verfügbar, bis Sie von NSObject erben.
Dmitrynikolaev

100% haben mein Problem NICHT behoben. JEDE Lösung lautet "Machen Sie Ihre Klassen öffentlich". Ich war das. Zeitraum. Die Swift-Klassen in Projekten, die das Framework verwenden, werden weiterhin NICHT angezeigt.
datWooWoo

@lespommes, du solltest eine Frage schreiben und irgendwo ein Beispielprojekt aufstellen, das das Problem aufzeigt. Jemand könnte herausfinden, was los ist. Ich habe nur meine Antwort als eine mögliche Lösung angegeben, weil es der Sichtbarkeitsfehler ist, den ich am meisten mache häufig.
Kendall Helmstetter Gelner

2
Oh ja, dein Hinweis mit dem Import hat endlich den Trick für mich getan! Vielen Dank!
Endowzoner

14

Ich hatte das gleiche Problem. Anscheinend müssen Sie die Einstellungen (Definiert Modul- und Produktmodulname) anpassen, bevor Sie Ihre erste Swift-Datei hinzufügen.

Wenn Sie dies später tun, wird die Datei "* -Swift.h" für dieses Projekt nicht generiert, selbst wenn Sie weitere Swift-Dateien hinzufügen oder die Swift-Datei löschen und eine neue erstellen.


Ich bin mir nicht sicher, ob das stimmt. Ich habe mich erst lange nach dem Erstellen vieler schneller Dateien für die Aktivierung von 'Defines Module' entschieden und konnte eine -Swift.h erhalten.
Michael Peterson

Ich bin wirklich traurig zu berichten, dass dies genau das Problem ist, das ich hatte :( Ich musste meine .swift löschen und erneut hinzufügen, und dann funktionierte alles.
StuFF mc

2
Was jetzt? Ich bin gerade dabei, sowohl den Swift- als auch den ObjC-Code zu ändern. Mein Project-Swift.h wird nicht aktualisiert. Ich habe sogar versucht, die Header-Datei zu löschen.
Suhail Bhat

2
Ich musste dieses aufschreiben , dev.iachieved.it/iachievedit/?p=980 . Der Tipp zum Aktualisieren der Build-Einstellungen vor dem Hinzufügen von Swift-Dateien war für mich der Schlüssel.
Joe

Bedeutet dies, dass ich das Projekt neu erstellen und alles neu hinzufügen müsste, wenn ich dies nicht tun würde? Egal was ich mache, ich kann anscheinend nicht die * -Swift.h-Datei generieren.
kgreenek

13

Gestatten Sie mir, meine Erfahrungen mit Swift in einem alten Objektprojekt zu teilen. Ich habe nicht festgelegt Defines modulezu YES.

In meinem Fall musste ich manuell sicherstellen, dass es einen objc Bridging Header gab. In meinen Build-Einstellungen war nur der generierte Name des Schnittstellen-Headers vorhanden.

Fehlender Überbrückungsheader

Dies führte dazu, dass eine MyApp-Swift.h-Datei generiert wurde, jedoch ohne Spuren meiner Swift-Klassen.

In der Apple-Dokumentation heißt es, dass Sie beim Hinzufügen Ihrer ersten schnellen Datei aufgefordert werden, einen Bridging-Header zu erstellen. Nun, das war ich nicht. Ich habe manuell eine MyApp-Bridging-header.hDatei hinzugefügt und im Feld "Objective-C Bridging Header" darauf hingewiesen. Dadurch wurde meine MyApp-Swift.h-Datei mit meinen Swift-Klassen gefüllt.

Docs: Swift in Objective-C importieren


Ja, aus welchem ​​Grund auch immer, meine ObjC Swift.h-Datei wurde mit Swift-Klassen-Headern erst generiert, nachdem ich dem Projekt eine leere Bridging-Header-Datei hinzugefügt habe!
Andrew

Hier gilt das gleiche. Mein Swift-Code wurde nicht in die generierte * -Swift.h-Datei importiert, bis ich eine leere Objective-C-Bridging-Header-Datei hinzugefügt habe.
Nik

12

Hier ist eine weitere Variante von moduleName-Swift.h, die nicht generiert wird.

Ich habe beschlossen, IOS-Diagramme in mein Projekt aufzunehmen, wollte aber die Quellen nicht im selben Verzeichnis mischen. Deshalb habe ich den Ordner "Diagramme-Projekt" neben dem Projektordner meines Codes abgelegt. Ich habe das Diagrammprojekt in die Navigatorleiste meines Projekts gezogen und das Framework in die Liste der eingebetteten Binärdateien meines Projektziels in den allgemeinen Projekteinstellungen aufgenommen und den Schalter " Eingebetteter Inhalt enthält Swift-Code" auf der Registerkarte " Build-Einstellungen" meines Projekts im Abschnitt " Build-Optionen" auf "Ja" gesetzt .

Die Datei moduleName-Swift.h meines Projekts würde niemals generiert, unabhängig davon, welche anderen Schalter oder Einstellungen hier vorgeschlagen wurden. Schließlich habe ich mithilfe der Methode von Lou Z zum Suchen der Dateien -Swift.h festgestellt, dass eine Datei Charts-Swift.h tief im xcode Build-Verzeichnis meines Projekts in Charts.framework / Headers / generiert wurde.

Die Lösung für die Verwendung von Daniel Gindis ios-chart Swift-Paket ohne Aufnahme des Codes in das Quellverzeichnis meines Projekts bestand darin, Folgendes hinzuzufügen:

#import "Charts/Charts-Swift.h"

Zu den Modulen, die die Daten meines Projekts darstellen.


Ist es möglich, Tooltips in IOS-Diagrammen zu ändern / anzupassen? Wenn ja, können Sie ein Beispiel geben?
Amit Chauhan

12

Vor dem Dateinamen steht immer Ihr Zielname . Es wird als Produktname bezeichnet, ist aber praktisch der Zielname. Wenn Sie also möchten, dass es für ein neues Ziel erstellt wird, müssen Sie bereit sein, eine that_target-Swift.hDatei zu erwarten .

Eine Möglichkeit, damit umzugehen, ist

  1. Fügen Sie für jedes Ihrer Ziele einen Präprozessor hinzu, der der Name Ihres Ziels selbst ist (ohne Leerzeichen). Ex. MY_TARGET=1. Fügen Sie dies unter Projekteinstellungen-> Build-Einstellungen-> Präprozessor-Makros für jedes Ihrer Ziele hinzu.
  2. Wenn Sie eine PCH-Datei verwenden,

Fügen Sie diese Zeilen in die PCH-Datei ein

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

Der Vorteil der Verwendung der PCH-Datei besteht darin, dass Sie die Header nicht überall einfügen müssen.

  1. Wenn Sie keine PCH-Datei verwenden, fügen Sie einfach dieselben Zeilen in einen einzelnen Header ein und fügen Sie diesen Header überall dort ein, wo Sie die Swift-Klassen verwenden müssen.

Dies sollte gut funktionieren.


Ich mag es wirklich, diese Lösung zu verwenden, anstatt den Header direkt in Ihre Quelle zu importieren. Ich habe eine komplizierte Projektstruktur, in der derselbe Quellcode von mehreren Zielen / Projekten verwendet wird. Dadurch wird vermieden, dass im gesamten Code eine unordentliche # if # else-Anweisung hinzugefügt wird. Danke für die Antwort!
Ryan

Das hat mir den Tag gerettet. Ich habe die 5 Codezeilen in eine "Something-Swift-Headers.h" -Datei (mit includedarin) eingefügt . Dann importiere ich diese neue Datei von dort, wo ich sie brauche. Ich bevorzuge es, dies nicht in den PCH oder eine .h-Datei zu setzen, um zyklische Abhängigkeiten zu vermeiden und den Convenience-Header in .m-Dateien zu verwenden.
Ctietze

Das ist auf so vielen Ebenen falsch. Erstens wird von .pchDateien dringend abgeraten . Zweitens enthält der Dateiname den Produktnamen und NICHT den Zielnamen. Es könnte ein Zufall sein, dass es dasselbe ist, aber es wurde der Produktname verwendet!
Iulian Onofrei

10

Wenn Xcode tatsächlich Ihren -Swift.h-Header generiert (tief in DerivedData), sich jedoch nicht auf Ihre Swift-Klassen bezieht, stellen Sie sicher, dass Sie auch einen Bridging-Header definiert haben. Die Art und Weise, wie ich die Dokumente las, implizierte, dass ich das nur zum Aufrufen von Objective-C von Swift aus benötigte, aber es scheint auch zum Aufrufen von Swift von Objective-C notwendig zu sein.

Siehe meine Antwort: https://stackoverflow.com/a/27972946/337392

BEARBEITEN: Dies liegt an den Modifikatoren für den öffentlichen und den internen Zugriff, wie ich schließlich in den Apple-Dokumenten erklärt habe: -

Standardmäßig enthält der generierte Header Schnittstellen für Swift-Deklarationen, die mit dem öffentlichen Modifikator gekennzeichnet sind. Es enthält auch diejenigen, die mit dem internen Modifikator markiert sind, wenn Ihr App-Ziel einen Objective-C-Bridging-Header hat.


Ja, das hat wirklich geholfen. Das wusste ich nicht. Ich dachte, dass es nur für den Anwendungsfall Obj-C von Swift benötigt wird.
Knotenteich

Freue mich zu helfen. Ich habe die Antwort bearbeitet, weil ich seitdem den Grund für dieses Verhalten herausgefunden habe.
Echelon

7

Zweitens, was viele Leute hier haben, aber einen relevanten Screenshot hinzufügen. Swift- und Obj-C-Code können durchaus zusammenleben. Es ist kein Alles oder Nichts-Spiel.

Um auf Swift-Dateien in Ihrem Objective-C zuzugreifen, müssen Sie diesen Aufruf lediglich zu Ihrer Obj-C-Datei hinzufügen (in der .m / Implementierungsdatei):

#import "{product_module_name}-Swift.h"

(Wobei {Produktmodulname} den Produktmodulnamen Ihres Projekts darstellt). Anstatt zu versuchen, den Namen Ihres Produktmoduls zu erraten oder Eckfälle mit Leerzeichen und Sonderzeichen herauszufinden, gehen Sie einfach auf die Registerkarte Build-Einstellungen im Projekt und geben Sie "Name des Produktmoduls" ein - der Inspektor zeigt Ihnen Ihren Namen. Meins war etwas, was ich nicht erwartet hatte. Schauen Sie sich diesen Screenshot an, wenn Sie verwirrt sind.

Geben Sie hier die Bildbeschreibung ein

Und damit Obj-c-Code in Swift funktioniert, müssen Sie nur eine Bridging-Header-Datei hinzufügen und die entsprechenden Obj-C-Header dort importieren.


1
Sollte es nicht sein #import?
Iulian Onofrei

Angenommen, mein Projektname ist ABC, dann muss "ABC-Swift.h" in meinem Projekt vorhanden sein, oder? Ich kann es nicht finden Müssen Sie es manuell erstellen? Ich erstelle selbst keine schnellen Dateien, sondern nur eine Kakaofrucht, die in Swift geschrieben ist.
Nr. 5

Der Bridging-Header (in Ihrem Fall ABC-Swift.h) wird nicht automatisch erstellt. Wenn Sie versuchen, Ihre erste Swift-Datei in einem Obj-C-Projekt zu erstellen, werden Sie von Xcode normalerweise aufgefordert, eine hinzuzufügen. Sie können auch selbst einen Bridging-Header erstellen, wie hier gezeigt (
Strg

5

Das Wichtigste ist, dass diese Datei unsichtbar ist !!! Zumindest ist es in Xcode6 Beta5. In Ihrem Arbeitsbereich befindet sich keine solche Datei mit dem Namen "YourModule-Swift.h". Stellen Sie einfach sicher, dass Sie den Modulnamen haben und das Modul auf yes gesetzt haben, und verwenden Sie es in Ihrer Objective-C-Klasse.


5

Ok, hier sind alle Dinge, die du wirklich brauchst!

1.Entfernen Sie alle von Ihnen hinzugefügten schnellen Dateien und kompilieren Sie den Code ohne Fehler.

----------

Geben Sie hier die Bildbeschreibung ein

----------

2. Gehen Sie zu den Build-Einstellungen "Projekte" und legen Sie den Namen des Produktmoduls fest. Das Projekt muss einen Produktmodulnamen haben, der keine Leerzeichen enthält.

----------

Geben Sie hier die Bildbeschreibung ein

----------

3.Defines Module muss in den Build-Einstellungen unter Packaging in Ihrem Projekt auf Yes gesetzt sein und darf nicht als Ziel festgelegt werden!

----------

Geben Sie hier die Bildbeschreibung ein

----------

4. Erstellen Sie jetzt eine schnelle Datei oder einen Ansichts-Controller unter file-> newFile->

----------

Geben Sie hier die Bildbeschreibung ein

----------

Es wird gefragt, ob ein Bridging-Header erstellt werden soll, damit dieser erstellt werden kann. Wenn Sie es einmal abgelehnt haben, müssen Sie manuell einen -Bridging-Header.h hinzufügen

5. Fügen Sie im Controller @objc hinzu, um dem Compiler mitzuteilen, dass eine schnelle Datei vorhanden ist, die für ObjectiveC verfügbar gemacht werden muss

----------

Geben Sie hier die Bildbeschreibung ein

----------

6.Erstellen Sie das Projekt und importieren Sie #import "-Swift.h" in einen der ObjectiveC-Controller, und es wird funktionieren! Sie können bei gedrückter Befehlstaste darauf klicken, um die aktuelle Datei anzuzeigen!

----------

Geben Sie hier die Bildbeschreibung ein

----------

Hoffe das hilft!


>> Sie können mit der Befehlstaste darauf klicken, um die aktuelle Datei anzuzeigen! Das ist cool
Jagan

4

Diese Antwort befasst sich mit dem Anwendungsfall, in dem Sie möglicherweise bereits einen Objective-C-Code haben, der Swift-Klassen aufruft, und dann wird dieser Fehler angezeigt.

So beheben Sie ein Problem

Die folgenden Schritte haben letztendlich alle Probleme für mich gelöst. Ich habe oben jemanden gelesen, der das "Huhn und das Ei" erwähnt, und genau dieses Konzept hat mich zu diesem Verfahren geführt. Dieser explizite Prozess zeigt, dass jeder Objective-C-Code, der auf Swift-Klassen verweist, entfernt werden muss, bis der Header generiert wurde.

  1. Kommentieren Sie die # import "ProductModuleName-Swift.h" -Anweisung in Ihrer Objective-C-Implementierungsdatei aus
  2. Kommentieren Sie alle Verweise in der Objective-C-Implementierungsdatei auf Swift Classes aus
  3. Reinigen und bauen
  4. Beheben Sie alle Fehler / Warnungen
  5. Entfernen Sie den Kommentar zur # import "ProductModuleName-Swift.h" -Anweisung
  6. Bereinigen und erstellen (erfolgreich oder verbleibende Fehler beheben, stellen Sie sicher, dass Sie zu diesem Zeitpunkt keine Swift-Klassen in Objective-C referenzieren . Wenn ja, kommentieren Sie diese vorübergehend aus.)
  7. Stellen Sie sicher, dass "ProductModuleName-Swift.h" durch Cmd-Klicken auf den Klassennamen der # import "ProductModuleName-Swift.h" -Anweisung generiert wird
  8. Entfernen Sie den Kommentar zum Code, der auf Swift-Klassen verweist, in der Objective-C-Implementierungsdatei.
  9. Clean & Build wie gewohnt (die Datei "ProductModuleName-Swift.h" sollte generiert werden und Ihr Objective-C-Code, der auf Swift-Klassen verweist, kann wie gewohnt verwendet werden.)

Hinweis: Die oben angegebenen Antworten zum Ändern von Leerzeichen in Unterstriche und zum Definieren des Moduls in JA gelten weiterhin, wenn Sie diesen Vorgang ausführen, ebenso wie die in der Apple-Dokumentation angegebenen Regeln .

Überbrückungskopfpfad

In einem Fehler wurde die Datei ProductModuleName-Bridging-Header.h während des Erstellungsprozesses nicht gefunden. Diese Tatsache erzeugte einen Fehler

<unbekannt>: 0: Fehler: Bridging-Header '/Users/Shared/Working/abc/abc-Bridging-Header.h' existiert nicht

Bei näherer Betrachtung der Fehler angezeigt , dass die Datei nie an der Stelle beschrieben existieren würde , weil es tatsächlich an (gelegen war ein Irrweg )

'/Users/Shared/Working/abc/abc/abc-Bridging-Header.h'. Eine schnelle Suche in den Build-Einstellungen für Ziele / Projekte, um die Korrektur manuell vorzunehmen, und die Datei abc-Swift.h wurden erneut automatisch generiert.

Build-Einstellungen


1
Was ist, wenn Ihr Projekt so groß ist, dass das Auskommentieren aller Verweise auf schnellen Code in Ziel c unpraktisch ist?
Andrew Morris

3

Sie müssen einen Header in Objective-C-Klassen importieren.

#import “ProductModuleName-Swift.h”

Es wird automatisch generiert und enthält die Referenz "Alle Swift-Dateien in Ihrem Ziel werden in Objective-C .m-Dateien angezeigt, die diese Importanweisung enthalten."


24
Wenn ich das mache, erhalte ich einen Build-Fehler, AppName-Swift.h existiert nicht. AppName-Bridging-Header.h ist dagegen vorhanden.
David Kristensen

5
@ DavidKristensen: Haben Sie eine Lösung dafür bekommen?, Da ich bei dem gleichen Problem geblieben
bin

2

Eine tatsächliche Datei im Projekt wird nicht erstellt ([ProductModuleName] -Swift.h). Befehlstaste + Klicken Sie auf den Import, um ihn entweder im laufenden Betrieb (und im Arbeitsspeicher) zu generieren, damit Sie sehen können, wie die Verknüpfung erfolgt, oder um eine Datei irgendwo in einem Xcode-Cache-Verzeichnis zu öffnen, aber nicht im Projektverzeichnis.

Sie müssen die Projektstütze " Modul definieren " (in den Build-Einstellungen des Ziels) auf " Ja" setzen Wenn Ihr Modulname Leerzeichen oder Bindestriche enthält, verwenden Sie _ bei allen Importen der Datei [ProductModuleName] -Swift.h.

Sie können es in alle .h- und .m-Dateien importieren, in denen Sie schnelle Typen verwenden, oder Sie können es in die .pch-Datei importieren.

Wenn mein Modul (Projekt) "Testprojekt" heißt, würde ich es folgendermaßen in die .pch-Datei meines Projekts importieren (nur dort):

#import "Test_Project-Swift.h"

2

Nur ein Hinweis für jeden, der "." dort Projektname. Xcode ersetzt das "." mit einem Unterstrich "_" für die Swift-Version der Bridging-Header-Datei. Seltsamerweise ersetzt der generierte Bridging-Header.h die Punkte nicht durch Unterstriche.

Ein Projekt mit dem Namen My.Project hätte beispielsweise die folgenden Bridging Header-Dateinamen.

Bridging-Header.h (automatisch generiert)

My.Project-Bridging-Header.h

Swift.h

My_Project.h

Ich hoffe, das hilft jedem, der eine Periode benutzt hat und feststeckte wie ich. Diese Datei befindet sich am folgenden Speicherort.

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

Pass auf,

Jon


2

Das Projekt muss einen Modulnamen ohne Leerzeichen haben. Defines Module muss in den Build-Einstellungen unter Packaging auf Yes gesetzt sein. hat die # import-Anweisung auskommentiert:

Wenn beim Importieren von "ProductModuleName-Swift.h" immer noch Fehler auftreten, dann

// # importiere "ProductModuleName-Swift.h"

was eine Reihe anderer Fehler in meinem Swift-Code enthüllte.

Nachdem ich diese neuen Fehler behoben und das Quellgebäude erfolgreich erstellt hatte, habe ich #import und Bingo auskommentiert! Der Header wurde erstellt und korrekt importiert :)


Mein Problem war, dass ich auch Fehler in meinem Swift-Code hatte, es aber nicht wusste, bis ich die Datei -Swift.h auskommentierte. Vielen Dank!
Wird

1

Ich habe einen Trick gefunden, der immer bei mir funktioniert.

  1. Erstellen Sie Ihren #import "ProductModuleName-Swift.h" in Ihrer Datei appDelegate.h und in Ihrer Datei ProductName-Prefix.pch. Wenn Sie es nicht in xcode 6 haben, können Sie es auf diese Weise erstellen. Warum wird ProjectName-Prefix.pch in Xcode 6 nicht automatisch erstellt?
  2. Befehl + Umschalt + k, um Ihren Code zu bereinigen. Wenn Sie eine Fehlermeldung zu Ihrem "ProductModuleName-Swift.h" erhalten, löschen Sie ihn aus der Datei appDelegate.h.
  3. Bereinigen Sie Ihren Code erneut. Jetzt wird alles wie ein Zauber wirken
  4. Wenn Sie erneut eine Fehlermeldung zu "ProductModuleName-Swift.h" erhalten, erstellen Sie diese erneut in der Datei appDelegate.h und bereinigen Sie Ihren Code erneut.

Führen Sie diese Arbeit aus (löschen und erstellen Sie "ProductModuleName-Swift.h" aus der Datei "appDelegate.h" und bereinigen Sie Ihren Code), wenn Sie diesen Fehler erhalten, um ihn stummzuschalten.


1

Ich habe diese Lösung gefunden

  • Erstellen Sie SwiftBridge.h
  • setze #import "ProductModuleName-Swift.h"
  • Diese .h-Datei öffentlich machen (wichtig) Wählen Sie die Datei aus -> In Dateiinspektor anzeigen (rechte Leiste) -> Öffentlich machen

Jetzt kannst du

#import "SwiftBridge.h"

anstelle von ProductModuleName-Swift.h

Dies ist eine Problemumgehungslösung. Für die nächste Version von Xcode denke ich, dass dieses Problem gelöst sein wird. Viel Glück


Funktioniert nicht Ich habe es gerade versucht. In der Zeile wird #import “ProductModuleName-Swift.h”nur ein Fehler in der Datei SwiftBridge.h anstelle der ursprünglichen Objective-C-Codedatei angezeigt.
Supertecnoboff

1

Es fiel mir schwer, den Import von Swift-Headern durch meinen Modulnamen / Objective-C zu bestimmen. Ich habe auch hier viele Artikel gelesen.

Aber die endgültige Antwort für Ihren Projektnamen mit allen darin enthaltenen Sonderzeichen (sei es '.' Oder eine Zahl oder ein Leerzeichen) - den für Sie geeigneten Text finden Sie unter " Name des Produktmoduls " " unter den Build-Einstellungen des Ziels .

Zum Beispiel begann mein Zielname mit einer Ziffer - "1mg" und das oben erwähnte Feld zeigte "_mg" als meinen Modulnamen.

Also habe ich #import "_mg-Swift.h" verwendet und es hat funktioniert.

Der Produktmodulname in den Build-Einstellungen des Ziels gibt den richtigen Modulnamen an, der für Ihr Projekt geeignet ist


Wenn Sie einen Link zu einem Screenshot bearbeiten können, kann ich Ihre Antwort bearbeiten, um sie für Sie anzuzeigen.
SuperBiasedMan

1

In meinem Fall musste ich das Bereitstellungsziel auf mindestens "OS X 10.9" festlegen und der -Swift.hHeader wurde automatisch generiert. Beachten Sie, dass Sie beim Ändern der Bereitstellungszielversion möglicherweise viele veraltete Warnungen erhalten, insbesondere wenn Sie über eine ältere und sehr große Objective C-Codebasis verfügen. In unserem Fall hatten wir auch viel Arbeit in XIB-Dateien und Ansichtsklassen.


2
Für andere - suchen Sie in den Build-Einstellungen nach Ihrem Ziel, erhalten Sie den genauen Namen "MyProject-Swift.h" - das müssen Sie als "#include" MyProject-Swift.h "in die entsprechenden Objc-Dateien aufnehmen. Übrigens Antwort hat mir wirklich geholfen - daran zu arbeiten, einige ältere ObjectiveC Open Source zu konvertieren.
David H

0

Wenn Sie zuvor ein Projekt ohne “ProductModuleName-Swift.h” not foundFehlerprobleme erstellen konnten und jetzt wieder diese bösen Fehler erhalten, liegt der Grund möglicherweise in Ihren letzten Änderungen.

Für mich war dies durch (versehentliche) falsche .swiftDateicodierung. Das Zurücksetzen von Änderungen und das manuelle Zurückbringen der Aufgabe erledigt den Job.


0

Dies mag ein offensichtlicher Punkt sein (vielleicht zu offensichtlich), aber Sie müssen mindestens eine schnelle Datei im Projekt haben, damit der Header generiert werden kann. Wenn Sie Boilerplate- oder Konfigurationscode mit der Absicht schreiben, später schnell zu schreiben, funktioniert der Import nicht.


0

Ich musste den schnellen WatchOS2-Code aus meinem Objective C-Projekt löschen. Und erst danach bot XCode an, -Swift.h zu generieren


0

Ich hatte ein ähnliches Problem, aber mein Projekt wurde zuvor kompiliert und bekam nach einigen Änderungen des Dateicodes plötzlich einen Fehler. Ich habe eine Weile gebraucht, um herauszufinden, warum für die Datei myproject-swift.h der Fehler "Datei nicht gefunden" angezeigt wird. Die Codeänderungen, die ich vorgenommen hatte, hatten einige Fehler. Xcode hat diesen Fehler nicht angezeigt, sondern immer den Fehler "Datei nicht gefunden" angezeigt. Dann bekam ich eine Kopie des vorherigen Versionscodes und verglich sie nacheinander mit dem neuen Code und der zusammengeführten Datei. Nach jeder Dateizusammenführung hat das Projekt den Fehler gefunden. Wenn Sie also einen Fehler in Ihrem Code haben, zeigt Xcode möglicherweise nur den Fehler "Datei nicht gefunden" für die Datei myproject-swift.h an. Höchstwahrscheinlich haben Sie einen Kompilierungsfehler in Ihrem Projekt. Bereinigen Sie diesen Fehler und es wird funktionieren.


0

Wenn Sie etwas wie Cocoapods verwenden (und nicht im Projekt, sondern außerhalb des Arbeitsbereichs arbeiten), versuchen Sie, das Projekt zu öffnen und zu erstellen, bevor Sie den Arbeitsbereich öffnen und erstellen. YMMV.


0

Manchmal müssen Sie nur die Zielmitgliedschaft in der obj-c .m-Datei deaktivieren und dann erneut festlegen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.