ios - method - use objective c in swift




Xcode MyProjectName-Bridging-Header.h existiert nicht (8)

Ich möchte Swift in meinem Objective-C-Projekt verwenden. Also habe ich eine schnelle Klasse hinzugefügt:

import Foundation
@objc class System : NSObject {
    @objc func printSome() {
        println("Print line System");
    }
}

Und es in eine .m-Datei importiert:

#import "MyProjectName-Swift.h"

Beim Erstellen meines Projekts erhalte ich den folgenden Fehler:

Bridging header 'PathToMyProject/MyProjectName-Bridging-Header.h' does not exist

HINWEIS: Unter "Build-Einstellungen-> Swift Compiler - Codegenerierung-> Objective-C Bridging Header" ist auf MyProjectName-Bridging-Header.h festgelegt

Was soll ich tun, um dieses Problem zu lösen?

Jede Hilfe wird sehr geschätzt.

EDIT: Bridging-Header-Datei: #if definiert (__ has_include) && __has_include () # include #endif

#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
#elif __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
#endif
#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif

#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted) 
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif

#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif

#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"

#if defined(__has_feature) && __has_feature(modules)
#endif

#pragma clang diagnostic pop

Für diejenigen, die den Überbrückungs-Header entfernen

Ich ging den umgekehrten Weg, wie die meisten anderen hier antworten. Ich hatte zuvor einen Bridging Header verwendet, aber ich brauchte ihn nicht mehr. Nachdem ich es aus meinem Projekt gelöscht hatte, fing ich an, den Fehler zu bekommen, der in der Frage erwähnt wurde. Ich habe die folgenden Schritte durchgeführt, um mein Problem zu lösen.

  1. Gehen Sie zu Ziele> [Ihr App-Ziel]> Build-Einstellungen> Swift Compiler - Allgemein> Objective-C Bridging Header und löschen Sie den Pfad. (Danke an @Donamite für die Idee.) (Du kannst einfach "bridging" in das Suchfeld eingeben, um es zu finden.)
  2. Löschen Sie das abgeleitete Datum. Gehen Sie zu Xcode> Einstellungen> Standorte und klicken Sie auf den grauen Pfeil neben dem Ordner Abgeleitete Daten. Dann lösche deinen Projektordner.


Diesen Schritten müssen wir folgen, indem wir den Überbrückungs-Header erstellen.

  1. Datei-> Neu-> iOS-> Header-Datei , Geben Sie den Namen der Bridging-Datei an "yourProjectName-Bridging-Header.h"

  2. Build-Settings-> Objective-C Bridging Header , Geben Sie einfach den Bridging-Header-Dateiname wie "ProjectName-Bridging-Header.h" ein

    HINWEIS: Die Bridging-Header-Datei sollte sich im Hauptstammverzeichnis des Projekts befinden, in dem sich die Datei ".xcodeproj" befindet. Wenn nicht, verschieben Sie die Bridging-Headerdatei in den Stammordner des Projekts. Auf diese Weise kann Xcode auf die Bridge-Datei zugreifen.

  3. Erstellen Sie das Projekt, und importieren Sie die erforderlichen Dateien in den Header "Bridging".


Für mich hat es geholfen, $(SRCROOT) vor meinem Objective-C-Bridging-Header-Pfad zu verwenden.

$(SRCROOT)/swiftLibraries/swiftLibraries-Bridging-Header.h

Folgen Sie den unteren Schritten:

  1. Löschen Sie die Bridging-Header-Datei. . . (Vielleicht erstellen Sie manuell) und;
  2. Erstellen Sie eine neue Swift-Datei im Objective-C-Projekt. . . (Nicht importieren, zuerst erstellen)

Vielleicht helfen diese zwei Dinge, Ihr Problem zu lösen.


Ich habe festgestellt, dass nach dem manuellen Erstellen der Bridging-Header-Datei und dem Auswählen des Standardnamens und -orts der Bridging-Header im Projektverzeichnis unter dem Stammverzeichnis platziert wird.

Dies erfordert den folgenden Wert für die Einstellung: Ziele> [App-Ziel]> Buildeinstellungen> Swift Compiler - Codegenerierung> Objective-C Bridging Header :

$(SRCROOT)/$(PROJECT_NAME)/$(PROJECT_NAME)-Bridging-Header.h 

Beachten Sie, dass, wenn Ihr Projekt ein schnelles Modul (Framework) ist, Sie, wie in den Kommentaren erwähnt, Folgendes bevorzugen könnten:

$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h

In Ihrem Projekt haben Sie keine bridging-Header.h Datei, aber Ihr Projekt hat diesen Pfad. Dazu müssen Sie diesen Pfad löschen ...

Gehe zur Zieldatei und wähle Build-Einstellungen, ----> Swift Compiler - General, und lösche die Bridging-Header.h. Folgen Sie den nachstehenden Screenshots ....

Löschen Sie die Datei bridging-Header.h in Swift Compiler - General

Jetzt hast du so ...


Wenn die Bridging-Datei auf derselben Ebene wie die anderen Klassen erstellt wird, müssen Sie möglicherweise den relativen Pfad hinzufügen, wie diese Bilder zeigen. Beachten Sie, dass die Bridging-Datei auf derselben Ebene wie die anderen Klassen erstellt wird:

Ich habe den Namen korrekt in den Build-Einstellungen eingegeben,

aber der Compiler findet die Datei nicht.

Wenn ich daher den relativen Pfad vom Stamm des Projekts hinzufüge ( ./ProjectName/BridgerFileName.h ich füge ./ProjectName/BridgerFileName.h ),

Jetzt kompiliert es und ich kann eine Methode in meiner Objective C-Klasse aufrufen:


Überbrückungskopfdatei manuell erstellen

Löschen Sie zuerst die Bridging-Header-Datei, die Xcode erstellt. Und wählen Sie Ihr Projekt aus> Build-Einstellungen> Suchen Sie das Schlüsselwort. Swift Compiler - Codegenerierung. Klicken Sie auf Objective-C Bridging Header, löschen Sie diesen Pfad. Reinigen Sie jetzt Ihr Projekt.

Wählen Sie nun Ihr Projekt> Fenster in der Navigationsleiste. Wählen Sie Projekte und löschen Sie Ihre abgeleiteten Daten von dort.

Erstellen Sie nun eine neue Datei, wählen Sie die Quelle und dann die Header-Datei und erstellen Sie Ihre Bridging-Header-Datei. Dateiname muss Ihr Projektname-Bridging-Header.h sein und dann erstellen

Wählen Sie Ihr Projekt aus> Buildeinstellungen> Suchen Sie das Keyword. Swift Compiler - Codegenerierung. Klicken Sie auf Objective-C Bridging Header und fügen Sie nun den Pfad in diesem Objective-C Bridging Header wie Projektname-Bridging-Header.h hinzu

Jetzt importieren Sie Ihre Klassen in Bridging-Header-Datei und Sie können Ihren Code leicht kompilieren.

Ihre Bridging-Header-Datei sieht so aus, wenn Sie Ihre Datei manuell erstellen.





swift