2015-10-08 8 views
8

Ho un progetto misto Swift e Objective-C. Per accedere a un'API pubblica Swift in Objective-C, l'utente API deve attualmente importare "MyModule-Swift.h". Ho già un'intestazione dell'ombrello Objective-C chiamata "MyModule.h". Tuttavia, l'importazione di "MyModule.h" non funzionerà con le API Swift. Ho provato a importare "MyModule-Swift.h" nell'intestazione dell'ombrello, ma non lo trova (presumo poiché è generato al volo da Xcode).Include -Swift.h nell'intestazione dell'ombrello

Qualsiasi suggerimento in modo che un utente API possa sempre importare "MyModule.h" per utilizzare API pubbliche scritte in Swift/Objective-C sarà molto apprezzato.

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

Modifica: Mi scuso per non aver trovato il tempo per inquadrare correttamente la domanda. Ho un quadro chiamato MyModule.

Ho una classe Objective-C chiamato ABUser,

@interface ABUser: NSObject 

- (void)walk; 

@end 

ho voluto aggiungere nuovo comportamento di questa classe secondo i Swift, così ho definito un'estensione

extension ABUser { 

func swiftWalk() 

} 

Ora, dire che volevo per accedere al metodo swiftWalk definito su ABUser da un'app Objective-C, dovrei #import <MyModule/MyModule-Swift.h>. #import <MyModule/MyModule.h> funzionerebbe se volessi utilizzare il metodo walk. Ciò presuppone che l'intestazione dell'ombrello MyModule.h importi ABUser.h.

Ho sempre desiderato l'app Objective-C su #import <MyModule/MyModule.h> e non mi devo mai preoccupare se un'API è stata scritta in Objective-C o Swift nel framework. Così, ho provato a importare MyModule-Swift.h nell'intestazione dell'ombrello MyModule.h. Ma la mia app Objective-C non si è compilata se lo ha fatto. Non sono sicuro, se questo è perché MyModule-Swift.h viene generato da Xcode al volo durante il processo di compilazione.

Edit 2: Aggiunto un progetto di esempio per riprodurre il problema qui: https://github.com/priteshshah1983/MyObjectiveCApp

Il codice di riferimento è in ViewController.m. La compilazione fallirà con il ramo master. Per farlo funzionare, controlla il ramo working.

risposta

-1

Si scopre che l'utilizzo di @import MyModule; anziché #import <MyModule/Module.h> consente di utilizzare i metodi walk e swiftWalk come previsto dall'applicazione Objective-C.

Sinceramente non capisco i dettagli, ma spero che questo aiuti qualcun altro. Non esitate a spiegare!

+0

"Sentitevi liberi di spiegare" Qual è la mia motivazione? Ti sei aggiudicato la risposta corretta, quindi la ricompensa è impossibile da vincere. Hai buttato via anche 50 punti per niente ... E la domanda è ancora abbastanza brutta. Che cosa significa "Ma, questo non ha funzionato" anche _mean_? – matt

+0

Ok, ho ritirato la risposta come risposta corretta. Scusa, non penso di poterlo spiegare meglio di questo però. Ho notato che mi hai già votato per questo! – pshah

+0

Cosa non è possibile mostrare tutto il codice effettivo necessario a qualcuno per capire e riprodurre il problema? – matt

2

Il motivo per cui l'utilizzo di @import MyModule; ha funzionato, è che "i moduli sono un insieme del file eseguibile del framework e delle intestazioni" (from this SO post).

In altre parole, quando si esegue il numero @import MyModule;, Objective-C importa automaticamente tutte le intestazioni swift e Objective-C correlate al modulo, mentre non è possibile includere l'intestazione rapida dall'intestazione dell'ombrello. Suggerisco di dare un'occhiata alle differenze tra @import e #import nella risposta SO collegata.