Importieren von Project-Swift.h in eine Objective-C-Klasse… Datei nicht gefunden


128

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"( NewTestApplautet der Name des Produkts) und Modul).

Folgendes habe ich bisher getan:

  1. In Define Modules, ausgewählt YESfür die App.
  2. 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.hund AppDelegate.maber keiner von ihnen gearbeitet hat.

Was mache ich sonst noch falsch? Danke für Ihre Hilfe.


Screenshot der Einstellungen:

Geben Sie hier die Bildbeschreibung ein


Fehler, auf die ich derzeit stoße:

Geben Sie hier die Bildbeschreibung ein


3
Das Löschen aller abgeleiteten Daten in ~/Library/Developer/Xcode/DerivedDatahat den Trick für mich getan.
wzhang84

Hier ist, wie ich das Problem gelöst habe: stackoverflow.com/a/45338549/8102549
schrulnz

Antworten:


157

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 ....

  1. Jede Klasse, auf die Sie in der .h-Datei zugreifen müssen, muss eine solche Forward-Deklaration sein

@class MySwiftClass;

  1. NUR in der .m-Datei, wenn sich der Code im selben Projekt (Modul) befindet, müssen Sie ihn mit importieren

#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


3
Danke für die Antwort. Das hat mich in die richtige Richtung geführt. Ich hatte das gleiche Problem, aber mit einem Protokoll, also musste ich @protocol MySwiftProtocol anstelle des Imports in meine Header-Datei hinzufügen.
Palme

In der .h-Datei hat die Vorwärtsdeklaration der Klasse ohne das Importieren der .h-Datei den Trick für mich getan. Danke
Sikander

1
Beachten Sie, dass, wenn Ihr Produktname ein -Zeichen enthält, der Name der generierten Header-Datei in konvertiert wird _. Beispiel: Wenn Ihr Produktname lautet My-App, würden Sie importieren My_App-Swift.h.
Dvanoni

1
Ich habe einen neuen Weg gefunden, um den richtigen Namen der generierten Header-Datei zu finden: Gehen Sie zu Ihrem Ziel -> Build-Einstellungen -> Schlüsselwörter suchenObjective-C Generated Interface Header Name , Bingo!
Itachi

2
Ich habe beide Dinge getan und sehe immer noch das gleiche Problem. Glaubst du, es hat mit der Bestellung zu tun?
ArielSD

83

Wenn sich der Swift-Code in einem Modul befindet (wie in Ihrem Fall):

#import <ProductName/ProductModuleName-Swift.h>

Wenn sich der Swift-Code im Projekt befindet (gemischt mit Swift und ObjC):

#import <ProductModuleName-Swift.h>

In Ihrem Fall müssen Sie diese Zeile in die * .m-Datei einfügen:

#import <NewTestApp/NewTestApp-Swift.h>

WICHTIG: Sehen Sie sich das "<" in der Importanweisung an

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


Vielen Dank für die Antwort @ ikocel1. Leider haben diese nicht funktioniert. Ich habe versucht , Variationen <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h>und <NewTestApp/ViewController-Swift.h>alle im Inneren ViewController.m, aber auch weiterhin die „Datei nicht gefunden“ erhalten Fehler, trotz Cleaningdes Projekts jedes Mal nach einer Kombination versuchen. Ich habe einen Screenshot in den Text der Frage aufgenommen, falls es hilft.
Daspianist

Ich habe noch keinen Swift-Code eingegeben 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 anpassen ViewController.m.
Daspianist

1
Ich weiß nicht, ob es möglich ist, objc-Code und schnellen Code direkt in derselben Datei zu mischen.
Ikocel1

1
Vielen Dank, ich denke, dies war die Annahme, dass ich auf Apples "Mix and Match" -Dokument basiert hatte. Aber ich denke, nicht in der eigentlichen Datei. Danke dir!
Daspianist

6
Ich habe nicht verstanden, warum diese Antwort genehmigt wurde. Ja, es ist korrekt nach der Dokumentation, funktioniert aber praktisch auch bei mir nicht. Selbst in der Frage ist es offensichtlich, dass der Benutzer die Syntax verwendet, wie sie in dieser Antwort empfohlen wird, aber dennoch einen Fehler erhält.
Darius Miliauskas

54

Wie ich es geschafft habe, schnell in Objective-C zu importieren:

  • Definiert das Modul auf JA gesetzt (im Projekt - nicht im Ziel)
  • Name des Produktmoduls festgelegt (am Ziel - nicht am Projekt)
  • Importieren Sie in Ihrem ViewController.m den schnellen Code mit:

    #import "MyProductModuleName-Swift.h"
  • Fügen Sie Ihrem Objective-C-Projekt eine schnelle Datei hinzu (Datei -> Neu -> Swift), und Xcode erstellt den Bridging-Header von Objective-C zu Swift. Dies ist jedoch entscheidend, damit es auch umgekehrt funktioniert - anscheinend.

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


Hervorragende Noten. Ich würde hinzufügen, dass das Testziel ein eigenes Modul ist und einen eigenen Header mit dem Namen "<#TestTargetName #> - Swift.h" hat und dass alle Leerzeichen in den Zielnamen in Leerzeichen konvertiert werden.
Chuck Krutsinger

@ holm51 sorry das zu fragen, aber wo ist Define Moduleund Product Module Name?
Matchifang

Bindestriche -im Namen werden Unterstrichen konvertiert werden _als auch
CyberMew

11

Wenn 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.


Hallo Peter, wo findest du diese Datei? Oder wird es automatisch durch xcode generiert? Müssen Sie Ihre Poddatei aufgrund dieser Änderung auch anders einrichten?
Rob Norback

@RobNorback Wenn ich mich nicht irre, können Sie einfach 'import "Product-Swift.h" in die Obj-C-Header- / Implementierungsdatei schreiben, um den Effekt zu sehen, ohne etwas extra zu tun. Stellen Sie sicher, dass in Ihren Projekteinstellungen alle Konfigurationen für das Mischen von Swift und Obj-C aktiviert sind. Außerdem habe ich noch kein Problem mit Podfile festgestellt. Bitte lassen Sie mich wissen, wenn ich die Dinge anders sehe.
Petershine

Vielen Dank, ich hatte Stunden damit verbracht, dies zu debuggen, und das Problem war in der Tat, dass jedes der Module in meinem Projekt seine eigene -Swift.hHeader-Datei generierte . Das Problem wurde für mich behoben, indem alle (ich habe 5 Ziele) gezwungen wurden, eine gemeinsame Header-Datei zu verwenden.
Apoorv Khatreja

@ApoorvKhatreja wie hast du sie dazu gezwungen? Den Dateinamen explizit geschrieben?
Amit Raz

7

Wenn Sie eine Stunde mit diesem Problem verbracht haben, können Sie anhand der folgenden Schritte besser verstehen, was fehlt:

  1. Öffnen Sie die Xcode-Einstellungen und navigieren Sie zum Ordner DerivedData
  2. Suchen Sie im Finder nach "swift.h"
  3. Wenn Sie keine Datei project-swift.h finden können, wurde diese Datei nicht generiert. Normalerweise müssen Sie @objc zu einer Ihrer schnellen Klassen hinzufügen und die App erfolgreich erstellen. Erst dann generiert Xcode diese Datei
  4. Wenn Sie die Datei "xxx-swift.h" gefunden haben, stellen Sie sicher, dass Ihre Importanweisung den richtigen Namen enthält.

wie man eine schnelle Datei findet


Bitte fügen Sie nicht dieselbe Antwort auf mehrere Fragen hinzu . Beantworten Sie die beste Frage und kennzeichnen Sie den Rest als Duplikate, sobald Sie genügend Ruf erworben haben. Wenn es sich nicht um ein Duplikat handelt, passen Sie den Beitrag an die Frage an und markieren Sie ihn zum Löschen.
Bhargav Rao

Danke dafür! Ich habe den Diplay-Namen meiner App geändert (nicht den des Ziels) und der Swift-Header hat auch den Namen geändert. Nur so konnte ich herausfinden, was los war.
Lucas P.

Vielen Dank für die Beantwortung. Screenshots und eine präzise Punktform lassen mich sofort zurückblättern + schauen + meine Suche beenden ... Problem gelöst!
12.

6

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.


2
Wo befindet sich diese Datei? Ich sehe mich dort um und konnte nichts finden
Amit Raz

4

-Swift.hsollte von Xcode automatisch erstellt werden, wenn Swift-Code eine API über @objcoder [Info] verfügbar macht.@objcMembers

Normalerweise sieht ein Ort so aus

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

Es kann geändert werden durch

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

Standardmäßig ist der Wert $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)


2

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.


3
Aber wie importiere ich es in eine .h-Datei, wenn ich eine schnelle Klasse im objc-Header benötige?
Alexander Danilov

1

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!


In meinem Fall hatte ich das Problem, weil ich beschlossen hatte, die von Xcode angebotene Migration auf Swift 3 zu verschieben. Infolgedessen konnte Xcode keine Swift-Quelldateien erstellen und generierte nicht die Header, die eingeschlossen werden sollten.
iutinvg

1

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


1

Importieren der Header-Datei, dh

#import "<ProjectName>-Swift.h" 

In der .h-Datei wurde ein Fehler generiert, der Folgendes angibt:

-Swift.h 'Datei nicht gefunden

und der Build ist fehlgeschlagen.

Verwenden Sie stattdessen:

#import "<ProjectName>-Swift.h"

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.


1

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".


hervorragende Lösung
iOS Lifee

1

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.


0

Wenn Sie mehrere Ziele haben, stellen Sie sicher, dass Sie alle Frameworks erstellt haben


0

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.


0

Stellen Sie sicher, dass Ihre schnelle Klasse die öffentliche Deklaration hat und NSObject erweitert:

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

Der Import sollte mit Anführungszeichen und nicht mit Klammern funktionieren, wenn sich die Swift-Klasse im selben Projekt befindet.

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.