Ich habe ein Projekt, das in Objective-C gestartet wurde, und ich versuche, Swift-Code in dieselben Klassendateien zu importieren, in denen ich zuvor Objective-C geschrieben habe.
Ich habe die Apple- Dokumente zur Verwendung von Swift und Objective-C im selben Projekt sowie eine SO- Frage wie diese konsultiert , aber immer noch keinen Erfolg: Ich erhalte nach dem Einfügen weiterhin den Fehler "Datei nicht gefunden" #import "NewTestApp-Swift.h"
( NewTestApp
lautet der Name des Produkts) und Modul).
Folgendes habe ich bisher getan:
- In
Define Modules
, ausgewähltYES
für die App. - Stellen Sie sicher, dass der Name des Produktmoduls kein Leerzeichen enthält (siehe Abbildung unten).
Ich habe versucht , mit nach #import "NewTestApp-Swift.h"
innen ViewController.m
, ViewController.h
und AppDelegate.m
aber keiner von ihnen gearbeitet hat.
Was mache ich sonst noch falsch? Danke für Ihre Hilfe.
Screenshot der Einstellungen:
Fehler, auf die ich derzeit stoße:
~/Library/Developer/Xcode/DerivedData
hat den Trick für mich getan.Antworten:
Ich hatte das gleiche Problem und konnte mein Projekt nicht dazu bringen, schnell in obj-c-Klassen zu importieren. Mit Xcode 6 (sollte für Xcode 6+ funktionieren) und konnte dies auf diese Weise tun ....
@class MySwiftClass;
#import "ProductModuleName-Swift.h"
Link zur Apple-Dokumentation dazu
https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c
quelle
-
Zeichen enthält, der Name der generierten Header-Datei in konvertiert wird_
. Beispiel: Wenn Ihr Produktname lautetMy-App
, würden Sie importierenMy_App-Swift.h
.Objective-C Generated Interface Header Name
, Bingo!Wenn sich der Swift-Code in einem Modul befindet (wie in Ihrem Fall):
Wenn sich der Swift-Code im Projekt befindet (gemischt mit Swift und ObjC):
In Ihrem Fall müssen Sie diese Zeile in die * .m-Datei einfügen:
WICHTIG: Sehen Sie sich das "<" in der Importanweisung an
https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
quelle
<NewTestApp-Swift/NewTestApp-Swift.h>
,<NewTestApp/NewTestApp-Swift.h>
und<NewTestApp/ViewController-Swift.h>
alle im InnerenViewController.m
, aber auch weiterhin die „Datei nicht gefunden“ erhalten Fehler, trotzCleaning
des Projekts jedes Mal nach einer Kombination versuchen. Ich habe einen Screenshot in den Text der Frage aufgenommen, falls es hilft.ViewController.m
. Ich habe nur versucht, die Header zuerst zu importieren, um zu versuchen, Swift-Code zu akzeptieren. Ich werde sowohl Objective-C- als auch Swift-Code mischen und anpassenViewController.m
.Wie ich es geschafft habe, schnell in Objective-C zu importieren:
Importieren Sie in Ihrem ViewController.m den schnellen Code mit:
Für das letzte Teil dieses Puzzles danke ich Swiftoverload, dass ich darauf aufmerksam gemacht habe, dass ich tatsächlich eine Swift-Datei über die Xcode-GUI hinzugefügt habe und nicht nur vorhandene Swift-Dateien in mein Projekt gezogen und dort abgelegt habe, damit es funktioniert: http://nikolakirev.com/blog / using-swift-in-Objective-C-Projekt
quelle
Define Module
undProduct Module Name
?-
im Namen werden Unterstrichen konvertiert werden_
als auchWenn Sie Xcode 8.2.1 verwenden und unter Projekt > Build-Einstellungen> Objective-C Generated Interface- Headername suchen , wird dort nur eine Header-Datei mit dem Namen Product -Swift.h angezeigt
Dies bedeutet, dass Sie nicht jedes Modul separat aus der Objective-C .m-Datei importieren, sondern nur ein Produkt -Swift.h importieren, in dem alle Swift-Module zusammengefasst sind.
Ich bin auf dasselbe Problem gestoßen, als ich nach einer herkömmlichen Methode zum separaten Importieren von Modulen gesucht habe, aber die aktuelle Version von Xcode und Swift 3 hat es so geändert, dass nur ein Header für alle Modulimporte verwendet wird.
quelle
-Swift.h
Header-Datei generierte . Das Problem wurde für mich behoben, indem alle (ich habe 5 Ziele) gezwungen wurden, eine gemeinsame Header-Datei zu verwenden.Wenn Sie eine Stunde mit diesem Problem verbracht haben, können Sie anhand der folgenden Schritte besser verstehen, was fehlt:
quelle
Ich hatte Probleme beim Importieren von Swift in ein Objective-C-Projekt. Am Ende habe ich in den Ordner "Abgeleitete Daten" geschaut, um zu überprüfen, was Xcode 7 generiert. Der Dateiname war völlig anders als der, den ich erwartet hatte.
Sobald ich den tatsächlichen Dateinamen hatte, importierte ich diesen und das Projekt konnte erstellt werden.
quelle
-Swift.h
sollte von Xcode automatisch erstellt werden, wenn Swift-Code eine API über@objc
oder [Info] verfügbar macht.@objcMembers
Normalerweise sieht ein Ort so aus
Es kann geändert werden durch
Standardmäßig ist der Wert
$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
quelle
MODULE DEFINIEREN: JA und "ProjectName-Swift.h" in die .m-Datei der Obj-C-Klasse importieren
Dies funktionierte für mich, um auf Swift-Klassen in Obj-c zuzugreifen.
quelle
Hatte das gleiche Problem mit meinem Team, als ich mit git an einem Projekt arbeitete. Ein Entwickler hat Xcode nicht auf die letzte Version (7.3) aktualisiert, die für die neueste Swift 2.2-Version erforderlich war. Daher hat der Compiler die neue Swift-Syntax nicht erkannt und konnte keine Schnittstelle für die Swift-Bibliothek (Projektname-swift.h) generieren. Überprüfen Sie, ob die Xcode-Version die neueste ist!
quelle
Während der Entwicklung besteht möglicherweise die Möglichkeit, dass Sie eine schnelle Klasse haben, die nicht vollständig implementiert ist, aufgrund derer möglicherweise Syntaxfehler auftreten. Die Swift-Header-Datei kann nur verwendet werden, wenn alle Swift-Dateien fehlerfrei sind.
Stellen Sie sicher, dass die Swift-Dateien keine Syntaxfehler enthalten, und versuchen Sie dann, den Swift-Header in die Objective-C-Datei zu importieren
quelle
Importieren der Header-Datei, dh
In der .h-Datei wurde ein Fehler generiert, der Folgendes angibt:
und der Build ist fehlgeschlagen.
Verwenden Sie stattdessen:
in der .m-Datei, und obwohl der gleiche Fehler auftritt, unterdrückt das Ausführen des Projekts den Fehler trotzdem.
Die schnellen Klassen sind dann in der .m-Datei verfügbar.
quelle
Ich habe das Problem mit dem Namen des Projekts (Ziel) konfrontiert. Es enthielt das Symbol "-". Die Entscheidung war also die nächste: Wenn der Name des Projekts "Test-App" ist, lautet der Name der importierten Klasse "Test_App-Swift.h".
quelle
Wenn Ihr App-Name ein Sonderzeichen enthält, verwenden Sie _ als Sonderzeichen.
Zum Beispiel, wenn Ihr App-Name Name "Test App®" ist.
Dann können Sie eine schnelle Datei mit "Test_App_-Swift.h" importieren.
Leerzeichen und ® werden beim Importieren durch _ ersetzt.
quelle
Wenn Sie mehrere Ziele haben, stellen Sie sicher, dass Sie alle Frameworks erstellt haben
quelle
Xcode 11
Ich bin auf dieses Problem gestoßen, als ich auf Xcode 11 aufgebaut habe. Ich habe ein wenig gebraucht, um herauszufinden, was falsch war, aber im Wesentlichen hatte ich die Einstellung "Anzeigename" auf der Registerkarte "Allgemein" des Ziels geändert, anstatt direkt in der zu ändern
Info.plist
Datei über das zu Registerkarte "Info" auf dem Ziel.Dies führte dazu, dass Xcode 11.5 eine Reihe brandneuer benutzerdefinierter Build-Einstellungen neu schrieb / erstellte und den Namen des App-Moduls und des erstellten .app-Produkts änderte. In diesem Fall enthielt der neue Anzeigename auch einen Schrägstrich (
/
), was möglicherweise der Grund dafür ist, dass er nicht erstellt wurde (siehe Antwort von @Silversky Technology ) ).Unabhängig davon habe ich dieses Problem behoben, indem ich alle automatischen Änderungen von Xcode 11.5 an der Projektdatei rückgängig gemacht und die gleiche Änderung am Anzeigenamen des Bundles manuell vorgenommen habe
Info.plist
Datei Alles funktioniert einwandfrei.Ich wünschte, es würde dir sagen, dass es solche Sachen gemacht hat, bevor es gerade fertig war und es ohne deine Zustimmung macht.
quelle
Stellen Sie sicher, dass Ihre schnelle Klasse die öffentliche Deklaration hat und NSObject erweitert:
Der Import sollte mit Anführungszeichen und nicht mit Klammern funktionieren, wenn sich die Swift-Klasse im selben Projekt befindet.
quelle