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
,
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.
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.
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!
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.
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.
Tags und Links objective-c ios swift