Ziel C to Swift-Headerdatei mit mehreren Zielen

69

Ich rufe meine Swift-Klassen erfolgreich von Objective C (für das Ziel 'MyApp') über die import-Anweisung auf:

#import "MyApp-Swift.h"

Ich habe jetzt ein neues Ziel namens "MyAppLite" erstellt.

Beim Kompilieren des neuen Ziels werden Fehler angezeigt, da der Code "MyApp-Swift.h" benötigt, der Compiler jedoch "MyAppLite-Swift.h" erstellt.

Daher muss ich einen bedingten Swift / ObjC-Header #importfür das Ziel erstellen, gegen das ich kompiliere.

Wie kann das gemacht werden oder gibt es einen besseren Weg?

Fittoburst
quelle

Antworten:

81

Es ist auch möglich, die Product Module NameEinstellung Build Settingsfür alle Module gleich festzulegen (ich habe sie auf festgelegt $(PROJECT_NAME)), sodass die <project>-Swift.hgenerierte Datei für alle Module den gleichen Namen hat. Dadurch müssen keine Präprozessormakros hinzugefügt / überprüft werden.

C0D3LIC1OU5
quelle
1
Wenn Sie Ihre erste Swift-Datei in Ihrem Projekt erstellen, werden Sie von xcode aufgefordert, den Bridging-Header zum Projekt hinzuzufügen. In meinem Fall wurde nur die erforderliche Konfiguration zum ersten Build-Ziel hinzugefügt . Also musste ich auch die anderen Build-Ziele reparieren, indem ich dieObjective-C Bridging Header
Kevin R
Ich stellte fest, dass dies Probleme beim Erstellungsprozess verursachte und dass ich beim Wechseln zwischen ihnen den Erstellungsordner bereinigen musste. Ich glaube, weil sie alle denselben Projektnamen haben, bauen sie alle in demselben Ordner.
Saltymule
11
Ich bin mir nicht sicher, aber ich habe das Gefühl, dass das Durcheinander mit dem Product Module NameWillen etwas später beeinflusst, wahrscheinlich beim Einreichen im App Store;) ... das Ändern der Objective-C Generated Interface Header Namein der anderen Antwort beschriebenen hat keine Auswirkungen.
Dan Rosenstark
2
@Yar Hab gerade deinen Kommentar gesehen. Das war anfangs mein Gefühl, aber die App ist schon eine Weile im App Store und es war kein Problem. Aber wenn ich die neueste Version von Xcode verwenden würde, würde ich die Lösung von Mike Fay verwenden. Diese Antwort wurde gemacht, bevor sie SWIFT_MODULE_NAMEverfügbar war.
C0D3LIC1OU5
Gott schütze dich! Die Verwendung des gleichen Modulnamens für alle meine Ziele erspart mir ein beschissenes Problem mit der benutzerdefinierten Swift-Klasse in einem gemischten Swift / ObjC-Projekt, das nur im Release-Build auftritt !!! Vielen Dank!
Vitalii Gozhenko
63

Der beste Weg, um dieses Problem zu beheben, sind die Einstellungen Ihres freigegebenen Xcode-Projekts. Sie können nach folgender Einstellung suchen:

Name der von Objective-C generierten Schnittstelle Header *

Wenn Sie diesen Wert auf einen allgemeinen Headernamen festlegen, z. B. "MyProject-Swift.h", wird er auf jedes Ihrer Ziele angewendet, und Sie können die Importdeklaration sicher in jeder Ihrer Objective-C-Dateien verwenden. Auf diese Weise können Sie bei Bedarf weiterhin eindeutige Produktmodulnamen für jedes Ziel verwenden.

Ich habe dies in Xcode Version 6.4 (6E35b) getestet.

* Hinweis: Dies wird unter Ihren Swift-Compilereinstellungen angezeigt, die nur sichtbar sind, wenn Sie Swift-Quelldateien zu Ihrem Projekt hinzugefügt haben. Wenn einem Ziel keine Swift-Quelle zugeordnet ist, werden die Swift-Compileroptionen für die Build-Einstellungen dieses Ziels nicht angezeigt.

Viel Glück!

Mike Fay
quelle
3
Dies ist die beste Lösung IMO.
Rafael Nobre
2
Der ursprüngliche Wert dieser ist $(SWIFT_MODULE_NAME)-Swift.h... also , während diese Antwort ist genial, ich würde gerne wissen , wie das justieren SWIFT_MODULE_NAMEfür das Modul.
Dan Rosenstark
1
Während ich hier bin, würde ich empfehlen, einen offensichtlichen Namen zu verwenden, um Verwirrung zu vermeiden, z. B. MidiDesignerAllTargets-Swift.hDanke für diese großartige Antwort, es ist eine großartige Entdeckung.
Dan Rosenstark
1
Dies ist die beste Lösung, wenn Sie Xcode 7+ verwenden.
Hdoria
1
Es ist definitiv noch in Version 8.3.3 (8E3004b) verfügbar.
Mike Fay
41

Frühere Antworten haben einige Probleme, wenn Sie Ihre Ziele oder Ihr Projekt umbenennen oder SWIFT_MODULE_NAMEbestimmungsgemäß verwenden.

Die universellste Lösung besteht darin, SWIFT_OBJC_INTERFACE_HEADER_NAMEunter "Projekt-C-generierter Schnittstellen-Headername" unter "Projektziele, nicht Ziele, Build-Einstellungen" Folgendes zu ändern :

  • $(PROJECT_NAME)-Swift.h - eine pro Projekt;
  • $(SWIFT_MODULE_NAME)-Swift.h - eine pro Modul (Standardwert).

Geben Sie hier die Bildbeschreibung ein

Dmitry Isaev
quelle
2
Die sauberste aller Lösungen.Xcode 8.3.3, Swift 3, stellen Sie sicher, dass die gemeinsamen / gemeinsam genutzten Swift-Dateien zu jedem Ziel gehören. Danach funktioniert alles.
Klajd Deda
1
Wie gehe ich mit "$ (PROJECT_NAME) -Swift.h Datei nicht gefunden" Fehler wie Warnungen um?
ViruMax
1
Dies sollte akzeptiert werden. Antwort, da es einige weitere Details zeigt, obwohl die Antwort von @ C0D3LIC1OU5 gut genug war
Sandeep Rana
1
Das ist was ich suche. Vielen Dank für Ihre Antwort.
Emre Önder
5

Nun, der einzige Weg, den ich reparieren kann, ist ...

#ifdef IS_LITE
#import "MyApp_Lite-Swift.h"
#else
#import "MyApp-Swift.h"
#endif

Beachten Sie, dass in meinem Produktmodulnamen "unzulässige" Zeichen durch Unterstriche ersetzt werden müssen.

Hoffentlich hilft das!

Fittoburst
quelle
Dies funktionierte für mich, da die akzeptierte Antwort beim Wechseln zwischen Zielen Build-Probleme verursachte.
Saltymule
5

Ich habe die entsprechende Anweisung #import <project> -Swift.h in eine Präfix-Header-Datei (<project> -Prefix.pch) eingefügt, die für jeden Build (Ziel / Schema) definiert / hinzugefügt wurde.

Wille
quelle
Dies hat den Vorteil, dass die Verwendung von Swift-Klassen in Objective-C bequemer wird und eine größere Konsistenz zwischen der Swift-Erfahrung, bei der Header nicht explizit importiert werden müssen, und der Objective-C-Erfahrung besteht.
Paulmelnikow
0

Die einzige Arbeitsweise ist die folgende:

1- Vom ersten Ziel (mit einer funktionierenden Überbrückung) Build-Einstellung wählen Sie Ziel C Überbrückungs-Header
2- Kopieren Sie Ziel C Überbrückungs-Header
3- Öffnen Sie das andere Ziel Build-Einstellung
4- Fügen Sie es ein 5- Ändern Sie die Header-Datei zu Ihrer neuen Header-Datei (dh Ziel Bh)

(jetzt haben Sie diese Option für zwei Ziele)

Ahmad Albash
quelle