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.h
Header-Datei, die Swift-Klassen entweder als markierte @objc
oder 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.
quelle
Antworten:
Jetzt gehts.
Endlich funktioniert. Vielen Dank an alle für die Hilfe :-)
quelle
Build Settings
unterPackaging
ist meinDefines Module
eingestelltYes
und ich habe einProduct Module Name
ohne Leerzeichen erstellt. Die "* -Swift.h" wird nicht von XCode 6 generiert. ???Defines Module
aufYes
sowohl für Projekt- und Ziel, und eineProduct Module Name
definierte, mit ohne Leerzeichen , aber ich kann nicht scheinen , diese Datei erzeugt werden.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
quelle
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
#import
Aussage 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
#import
und Bingo auskommentiert! Der Header wurde erstellt und korrekt importiert :)quelle
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):
Wird es finden. Wenn nichts in diesem Ordner übereinstimmt, generiert Xcode es nicht.
Ich verwende Xcode Version 6.2 (6C86e)
quelle
-Swift.h
und nicht mit dem Namen meiner tatsächlichen Swift-Datei nachfixiert wurde . Danke dir!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:
quelle
* Das einzig Wichtige ist: *
um den definierten "Produktmodulnamen" im Ziel zu verwenden, gefolgt von -Swift.h
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 ...
quelle
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:
quelle
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.
quelle
Gestatten Sie mir, meine Erfahrungen mit Swift in einem alten Objektprojekt zu teilen. Ich habe nicht festgelegt
Defines module
zuYES
.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.
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.h
Datei 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
quelle
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:
Zu den Modulen, die die Daten meines Projekts darstellen.
quelle
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.h
Datei zu erwarten .Eine Möglichkeit, damit umzugehen, ist
MY_TARGET=1
. Fügen Sie dies unter Projekteinstellungen-> Build-Einstellungen-> Präprozessor-Makros für jedes Ihrer Ziele hinzu.Fügen Sie diese Zeilen in die PCH-Datei ein
Der Vorteil der Verwendung der PCH-Datei besteht darin, dass Sie die Header nicht überall einfügen müssen.
Dies sollte gut funktionieren.
quelle
include
darin) 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..pch
Dateien 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!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: -
quelle
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):
(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.
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.
quelle
#import
?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.
quelle
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.
----------
----------
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.
----------
----------
3.Defines Module muss in den Build-Einstellungen unter Packaging in Ihrem Projekt auf Yes gesetzt sein und darf nicht als Ziel festgelegt werden!
----------
----------
4. Erstellen Sie jetzt eine schnelle Datei oder einen Ansichts-Controller unter file-> newFile->
----------
----------
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
----------
----------
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!
----------
----------
Hoffe das hilft!
quelle
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.
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
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.
quelle
Sie müssen einen Header in Objective-C-Klassen importieren.
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."
quelle
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):
quelle
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
quelle
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 :)
quelle
Ich habe einen Trick gefunden, der immer bei mir funktioniert.
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.
quelle
Ich habe diese Lösung gefunden
Jetzt kannst du
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
quelle
#import “ProductModuleName-Swift.h”
nur ein Fehler in der Datei SwiftBridge.h anstelle der ursprünglichen Objective-C-Codedatei angezeigt.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.
quelle
In meinem Fall musste ich das Bereitstellungsziel auf mindestens "OS X 10.9" festlegen und der
-Swift.h
Header 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.quelle
Wenn Sie zuvor ein Projekt ohne
“ProductModuleName-Swift.h” not found
Fehlerprobleme 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
.swift
Dateicodierung. Das Zurücksetzen von Änderungen und das manuelle Zurückbringen der Aufgabe erledigt den Job.quelle
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.
quelle
Ich musste den schnellen WatchOS2-Code aus meinem Objective C-Projekt löschen. Und erst danach bot XCode an, -Swift.h zu generieren
quelle
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.
quelle
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.
quelle
Manchmal müssen Sie nur die Zielmitgliedschaft in der obj-c .m-Datei deaktivieren und dann erneut festlegen.
quelle