Include -Swift.h im Schirmkopf

8

Ich habe ein gemischtes Swift- und Objective-C-Projekt. Um auf eine öffentliche Swift-API in Objective-C zuzugreifen, muss der API-Consumer derzeit "MyModule-Swift.h" importieren. Ich habe bereits einen Objective-C Regenschirm-Header namens "MyModule.h". Aber das Importieren von "MyModule.h" wird nicht für die Swift-APIs funktionieren. Ich habe versucht, "MyModule-Swift.h" in den Regenschirm-Header zu importieren, aber es findet es nicht (ich nehme an, da es im laufenden Betrieb von Xcode erzeugt wird).

Alle Vorschläge, mit denen ein API-Consumer immer "MyModule.h" importieren kann, um öffentliche APIs zu verwenden, die in Swift / Objective-C geschrieben wurden, werden sehr geschätzt.

================================================ ======================

Bearbeiten : Ich entschuldige mich dafür, dass ich mir die Zeit genommen habe, die Frage richtig zu stellen. Ich habe ein Framework namens MyModule .

Ich habe eine Objective-C-Klasse namens ABUser ,

%Vor%

Ich wollte dieser Klasse mit Swift neues Verhalten hinzufügen, also habe ich eine Erweiterung definiert

%Vor%

Sagen wir nun, dass ich auf die swiftWalk -Methode, die in ABUser von einer Objective-C-App definiert wurde, zugreifen möchte, ich müsste #import <MyModule/MyModule-Swift.h> . #import <MyModule/MyModule.h> würde funktionieren, wenn ich die Methode walk verwenden möchte. Dies setzt den Umbrella-Header MyModule.h imports ABUser.h voraus.

Ich wollte immer, dass die Objective-C App auf #import <MyModule/MyModule.h> gesetzt ist und sich nie darum kümmern muss, ob eine API in Objective-C oder Swift im Framework geschrieben wurde. Also habe ich versucht, MyModule-Swift.h in den Regenschirm-Header MyModule.h zu importieren. Aber meine Objective-C-App kompiliert nicht, wenn das gemacht wird. Nicht sicher, wenn dies daran liegt, dass MyModule-Swift.h während des Build-Prozesses von Xcode generiert wird.

2 bearbeiten : Ein Beispielprojekt wurde hinzugefügt, um dieses Problem hier zu reproduzieren: Ссылка

Der entsprechende Code ist in ViewController.m . Der Build wird mit dem master Zweig fehlschlagen. Überprüfen Sie den Zweig working , um die Arbeit zu erledigen.

    
pshah 08.10.2015, 18:40
quelle

2 Antworten

2

Der Grund dafür, dass @import MyModule; funktioniert hat, ist, dass "Module eine Zusammenfassung der ausführbaren Framework-Datei und ihrer Header sind" ( aus diesem SO-Post ).

Mit anderen Worten: Wenn Sie @import MyModule; importieren, importiert Objective-C automatisch alle mit dem Modul verbundenen Swift- und Objective-C-Header, während Sie den Swift-Header nicht aus dem Umbrella-Header aufnehmen können. Ich schlage vor, dass Sie sich die Unterschiede zwischen @import und #import in der verknüpften SO-Antwort ansehen.

    
vigneshv 16.10.2015 04:36
quelle
-1
___ tag123ios ___ iOS ist das mobile Betriebssystem, das auf dem Apple iPhone, iPod touch und iPad ausgeführt wird. Verwenden Sie dieses Tag [ios] für Fragen zur Programmierung auf der iOS-Plattform. Verwenden Sie die verwandten Tags [objective-c] und [swift] für Probleme, die für diese Programmiersprachen spezifisch sind. ___ answer3160584 ___

Es stellt sich heraus, dass die Verwendung von @import MyModule; anstelle von #import <MyModule/Module.h> die Verwendung von walk und swiftWalk Methoden erlaubt, wie von der Objective-C App erwartet.

Ich verstehe ehrlich gesagt nicht die Details, aber ich hoffe, dass dies jemand anderem hilft. Bitte zögern Sie nicht zu erklären!

    
___ qstnhdr ___ Include -Swift.h im Schirmkopf ___ tag123objectivec ___ Dieses Tag sollte nur bei Fragen verwendet werden, die sich auf Objective-C-Funktionen beziehen oder von Code in der Sprache abhängen. Die Tags [Kakao] und [Kakao-Touch] sollten verwendet werden, um nach Frameworks oder Klassen von Apple zu fragen. Verwenden Sie die zugehörigen Tags [ios], [macos], [apple-watch] und [tvos] für Probleme, die für diese Plattformen spezifisch sind. ___ qstntxt ___

Ich habe ein gemischtes Swift- und Objective-C-Projekt. Um auf eine öffentliche Swift-API in Objective-C zuzugreifen, muss der API-Consumer derzeit "MyModule-Swift.h" importieren. Ich habe bereits einen Objective-C Regenschirm-Header namens "MyModule.h". Aber das Importieren von "MyModule.h" wird nicht für die Swift-APIs funktionieren. Ich habe versucht, "MyModule-Swift.h" in den Regenschirm-Header zu importieren, aber es findet es nicht (ich nehme an, da es im laufenden Betrieb von Xcode erzeugt wird).

Alle Vorschläge, mit denen ein API-Consumer immer "MyModule.h" importieren kann, um öffentliche APIs zu verwenden, die in Swift / Objective-C geschrieben wurden, werden sehr geschätzt.

================================================ ======================

Bearbeiten : Ich entschuldige mich dafür, dass ich mir die Zeit genommen habe, die Frage richtig zu stellen. Ich habe ein Framework namens %code% .

Ich habe eine Objective-C-Klasse namens %code% ,

%Vor%

Ich wollte dieser Klasse mit Swift neues Verhalten hinzufügen, also habe ich eine Erweiterung definiert

%Vor%

Sagen wir nun, dass ich auf die %code% -Methode, die in %code% von einer Objective-C-App definiert wurde, zugreifen möchte, ich müsste %code% . %code% würde funktionieren, wenn ich die Methode %code% verwenden möchte. Dies setzt den Umbrella-Header %code% imports %code% voraus.

Ich wollte immer, dass die Objective-C App auf %code% gesetzt ist und sich nie darum kümmern muss, ob eine API in Objective-C oder Swift im Framework geschrieben wurde. Also habe ich versucht, %code% in den Regenschirm-Header %code% zu importieren. Aber meine Objective-C-App kompiliert nicht, wenn das gemacht wird. Nicht sicher, wenn dies daran liegt, dass %code% während des Build-Prozesses von Xcode generiert wird.

2 bearbeiten : Ein Beispielprojekt wurde hinzugefügt, um dieses Problem hier zu reproduzieren: Ссылка

Der entsprechende Code ist in %code% . Der Build wird mit dem %code% Zweig fehlschlagen. Überprüfen Sie den Zweig %code% , um die Arbeit zu erledigen.

    
___ tag123swift ___ Swift ist eine universelle Open-Source-Programmiersprache, die von Apple Inc. für ihre Plattformen und Linux entwickelt wurde. Verwenden Sie das Tag nur für Fragen zu Sprachfunktionen oder für Code in Swift. Verwenden Sie die Tags [ios], [osx], [watch-os], [tvos], [cocoa-touch] und [cocoa] für (sprachunabhängige) Fragen zu den Plattformen oder Frameworks. ___ answer33162659 ___

Der Grund dafür, dass %code% funktioniert hat, ist, dass "Module eine Zusammenfassung der ausführbaren Framework-Datei und ihrer Header sind" ( aus diesem SO-Post ).

Mit anderen Worten: Wenn Sie %code% importieren, importiert Objective-C automatisch alle mit dem Modul verbundenen Swift- und Objective-C-Header, während Sie den Swift-Header nicht aus dem Umbrella-Header aufnehmen können. Ich schlage vor, dass Sie sich die Unterschiede zwischen %code% und %code% in der verknüpften SO-Antwort ansehen.

    
___
pshah 16.10.2015 00:17
quelle

Tags und Links