2014-10-08 4 views
47

ich meine Swift Klassen von Objective C (für Ziel ‚MeineAnw‘) über die Import-Anweisung erfolgreich Aufruf:Objective C zu Swift-Header-Datei mit mehreren Zielen

#import "MyApp-Swift.h" 

ich jetzt ein neues Ziel erstellt haben "MyAppLite" genannt

Als ich das neue Ziel zu kompilieren, bekomme ich Fehler, weil "MyApp-Swift.h" durch den Code erforderlich ist, aber der Compiler "MyAppLite-Swift.h"

So schafft, Ich muss einen bedingten Swift/ObjC Header #import für das Ziel, das ich bin kompilieren gegen dagegen.

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

Antwort

57

Es ist auch möglich, die Product Module Name Einstellung in Build Settings zu setzen das gleiche über Ihre Module sein (ich es $(PROJECT_NAME) gesetzt), so dass die <project>-Swift.h-Datei, die erzeugt wird, den gleichen Namen über alle Module hat. Dies macht das Hinzufügen/Prüfen von Präprozessor-Makros überflüssig.

+0

Endlich ging es ans Testen und Danke, das funktionierte für mich – Fittoburst

+1

Wenn Sie Ihre erste Swift-Datei in Ihrem Projekt erstellen, wird xcode Sie bitten, den Bridging-Header zum Projekt hinzuzufügen. In meinem Fall hat es dem _first_build-Ziel nur die benötigte Konfiguration hinzugefügt. Also musste ich auch die anderen Build-Ziele beheben, indem ich den 'Objective-C Bridging Header' konfigurierte. –

+0

Ich stellte fest, dass dies Probleme im Build-Prozess verursachte und dass ich den Build-Ordner reinigen musste. Ich glaube, da alle denselben Projektnamen haben, bauen sie alle in denselben Ordner. – Saltymule

3

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

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

Beachten Sie, dass, wenn es keine ‚illegalen‘ Zeichen in meinem Produktmodulname, müssen sie mit Unterstrichen ersetzt werden.

Hoffe, dass hilft!

+0

Das ist für mich gearbeitet, als die akzeptierte Antwort verursacht bauen Probleme beim Wechseln zwischen Zielen. – Saltymule

42

Der beste Weg, um dieses Problem zu lösen, ist in Ihren Xcode freigegebenen Projekteinstellungen. Sie können für die folgende Einstellung suchen:

Objective-C generiert Interface-Header-Name *

Wenn Sie diesen Wert auf einen gemeinsamen Header-Namen, wie "MyProject-Swift.h" gesetzt ist, wird es sein, auf jedes Ihrer Ziele angewendet und Sie können die Import-Deklaration sicher in einer 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-Compiler-Einstellungen angezeigt, die nur sichtbar sind, wenn Swift-Quelldateien zu Ihrem Projekt hinzugefügt wurden. Wenn einem Ziel keine Swift-Quelle zugeordnet ist, sind die Swift-Compileroptionen für die Build-Einstellungen dieses Ziels nicht sichtbar.

Viel Glück!

+1

Dies ist die beste Lösung IMO. – nobre

+2

Der ursprüngliche Wert von diesem ist $ (SWIFT_MODULE_NAME) -Swift.h' ... so während diese Antwort ist genial, ich würde * lieben * wissen, wie man das 'SWIFT_MODULE_NAME' für das Modul anpasst. –

+1

Während ich hier bin, würde ich empfehlen, einen offensichtlichen Namen zu verwenden, um Verwirrung zu vermeiden, z. B. 'MidiDesignerAllTargets-Swift.h' Danke für diese großartige Antwort, es ist ein * toller * Fund. –

5

habe ich die entsprechende #import <Projekt> -Swift.h-Anweisung in einer Datei Prefix-Header (<Projekt> -Prefix.pch) definiert/hinzugefügt für jeden Build (Soll/Schema).

+0

Dies hat den Vorteil, dass Swift-Klassen in Objective-C einfacher zu verwenden sind und die Swift-Umgebung, in der Header nicht explizit importiert werden müssen, und die Objective-C-Erfahrung konsistenter sind. – paulmelnikow

14

Frühere Antworten haben einige Probleme, wenn Sie sich entscheiden, Ihre Ziele oder Ihr Projekt umzubenennen oder SWIFT_MODULE_NAME wie vorgesehen zu verwenden.

Die universellste Lösung ist SWIFT_OBJC_INTERFACE_HEADER_NAME („Objective-C generiert Interface-Header-Name“) unter Projekts, nicht Ziele zu ändern, Build-Einstellungen zu:

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

enter image description here

+0

der sauberste aller Lösungen.Xcode 8.3.3, Swift 3, stellen Sie sicher, dass die gemeinsamen/geteilten Swift-Dateien zu jedem Ziel gehören, alles funktioniert danach. –

+0

Wie behandelt man "$ (PROJECT_NAME) -Swift.h Datei nicht gefunden" Fehler wie Warnungen? – ViruMax

0

Die einzige Art und Weise arbeiten wird, die folgenden:

1- vom ersten Target (die eine Arbeitsbrücken hat) Errichten Einstellung wählen Objective C Bridging-Header
2- Copy Ziel C Überbrückungskopf
3- Öffnen Sie das andere Ziel Build Einstellung
4- Paste es 5- Änderung der Header-Datei auf Ihre neue Header-Datei (dh Ziel Bh)

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