2015-10-08 5 views
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 Schirm-Header zu importieren, aber es findet es nicht (ich nehme an, da es im laufenden Betrieb von Xcode erzeugt wird).Include -Swift.h im Schirmkopf

Alle Vorschläge, dass 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, nicht die Zeit nehmen, um die Frage richtig zu gestalten. Ich habe ein Framework namens MyModule.

Ich habe eine Objective-C-Klasse namens ABUser,

@interface ABUser: NSObject 

- (void)walk; 

@end 

ich neues Verhalten zu dieser Klasse mit Swift, hinzufügen wollte so definiert ich eine Verlängerung

extension ABUser { 

func swiftWalk() 

} 

Nun, sage ich wollte Um auf die swiftWalk Methode zuzugreifen, die auf ABUser von einer Objective-C App definiert wird, müsste ich #import <MyModule/MyModule-Swift.h>. #import <MyModule/MyModule.h> würde funktionieren, wenn ich die walk Methode verwenden wollte. Dies setzt voraus, dass der Schirmkopf MyModule.h Importe ABUser.h importiert.

Ich wollte immer die Objective-C-App #import <MyModule/MyModule.h> und muss sich nie sorgen, ob eine API in Objective-C oder Swift im Framework geschrieben wurde. Also, ich habe versucht, MyModule-Swift.h in den Schirmkopf MyModule.h zu importieren. Aber meine Objective-C-App kompiliert nicht, wenn das gemacht wird. Nicht sicher, wenn dies der Fall ist, weil MyModule-Swift.h während des Build-Prozesses von Xcode generiert wird.

Edit 2: ein Beispielprojekt hinzugefügt hier, um dieses Problem zu reproduzieren: https://github.com/priteshshah1983/MyObjectiveCApp

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

Antwort

-1

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

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

+0

"Bitte zögern Sie zu erklären" Was ist meine Motivation? Du hast dir die richtige Antwort gegeben, also ist das Kopfgeld nicht gewinnbar. Du hast 50 Punkte auch für nichts weggeworfen ... Und die Frage ist immer noch ziemlich mies. Was "Aber, das hat nicht funktioniert" sogar _mean_? – matt

+0

Ok, ich habe meine Antwort als richtige Antwort zurückgenommen. Tut mir leid, ich glaube nicht, dass ich es besser erklären kann. Ich habe bemerkt, dass du mich bereits dafür gewählt hast! – pshah

+0

Was können Sie nicht alles den tatsächlichen Code zeigen, der benötigt wird, damit jemand das Problem versteht und reproduziert? – matt

2

Der Grund, warum die Verwendung von @import MyModule; funktioniert, ist, dass "Module sind eine Verpackung zusammen von der Framework ausführbar und es ist Header" (from this SO post).

Mit anderen Worten, wenn Sie @import MyModule; importiert, importiert Objective-C automatisch alle Swift und Objective-C-Header im Zusammenhang mit dem Modul, während Sie die schnelle Header aus dem Regenschirm-Header nicht enthalten können. Ich schlage vor, Sie werfen einen Blick auf die Unterschiede zwischen @import und #import in der verknüpften SO-Antwort.

Verwandte Themen