2014-06-06 21 views
77

Si tenta di importare un protocollo Swift denominato AnalyticProtocol in una classe Objective-C denominata AnalyticFactory.Importazione di un protocollo Swift nella classe Objective-C

protocol AnalyticProtocol 
{ 

} 

Sto iniziando da un progetto Objective-C esistente (non ho creato un nuovo progetto Swift con Xcode e non ho trovato come configurare il mio progetto di Objective-C per essere un progetto Swift in xCode 6).

Nel mio file Swift Ho incluso il file denominato .hMyProjectName-Swift.h ma il compilatore mi restituirà un errore che mi diceva che non esiste. Quindi, ho creato un file .h denominato MyProjectName-Swift.h che in realtà è vuoto (non so cosa dovrei inserire all'interno).

Nel Apple documentation hanno detto che devo includere il mio .h file chiamato MyProjectName-Swift.h nel mio file .m. Ma ho bisogno di includerlo non nel mio file .m ma nel mio .h. Questo può essere problematico?

Quando provo a compilare ho ottenuto questo errore: : 0: errore: xxxAnalyticFactory.h: 39: non riesce a trovare la dichiarazione di protocollo per 'AnalyticProtocol'

E il codice incriminato:

@interface AnalyticFactory : NSObject 
{ 
    Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used. 
} 

Penso di non capire bene come posso importare un protocollo Swift in una classe Objective-C.

Qualcuno vede un errore in quello che sto facendo?

+0

Controlla il [_Integrating Swift With Objective-C_] (http://devstreaming.apple.com/videos/ wwdc/2014/406xxssvkspk997/406/406_hd_integrating_swift_with_objective_c.mov? dl = 1) video del WWDC 2014. Verso le 30:40 nel video, descrivono come accedere ai protocolli Swift nelle classi Objective-C. –

risposta

159

è necessario aggiungere l'attributo @objc al protocollo Swift in questo modo:

@objc protocol AnalyticProtocol { 

} 
+12

Th cerca la tua risposta ma il problema persiste ancora. –

+0

Potresti pubblicare un progetto di esempio che riproduca il problema? –

+0

L'aggiunta di @objc mi ha aiutato con l'importazione delle classi Swift in Obj-C – serg

15

Ci sono tre semplici passi:

  1. Nel file .swift, aggiungere @objc prima che il protocollo nome:

    @objc protocol AnalyticProtocol { 
    
    } 
    
  2. Nel file .m, importa l'intestazione Swift generata. (Il file di intestazione è chiamato automagicamente):

    #import "ProductModuleName-Swift.h" 
    
  3. Per i protocolli Swift specificamente, è inoltre necessario inoltrare dichiarare il protocollo nel .h del file:

    @protocol AnalyticProtocol; 
    

Si prega di notare che, anche se questo è il modo consigliato da Apple di fare le cose, è dare un avviso quando si compila: Cannot find protocol definition.

Per evitare l'avvertimento:

Se non sei colmare qualche cosa di nuovo a Swift, è possibile includere nel file ProductModuleName-Swift.h.h (al posto del .m al punto 2); fai attenzione ai riferimenti ciclici se stai usando un'intestazione di bridging. Se hai riferimenti ciclici e vuoi comunque evitare l'avvertimento, l'altra alternativa è implementare il protocollo in Objective-C.

È possibile ottenere ulteriori informazioni sulla combinazione e il confronto di Objective-C e Swift here.

+0

Felice di modificare se necessario - si prega di commentare se si trova un problema con questa soluzione. –

+0

Ricevo ancora un avviso, con dichiarazione anticipata o senza. Sto usando il protocollo in un'estensione. –

+0

Grazie @ CristiBăluţă. Ho aggiornato la mia risposta per chiarire che l'avviso è previsto con l'approccio consigliato da Apple, (e cosa si può fare a riguardo se si tratta di te). Per quello che vale, ho finito per implementare il protocollo in Objective-C per evitare di vedere l'avviso. –

50

Non è possibile importare l'intestazione Swift generata da Xcode nei file di intestazione objC.

Quindi, dal momento che si desidera utilizzare il codice Swift in un file di intestazione objc, è necessario "avanti dichiarare" le classi e protocolli che si desidera utilizzare nel file di intestazione objc, in questo modo:

@protocol AnalyticProtocol; 

È ora possibile utilizzare il protocollo nella dichiarazione di classe objc:

@interface AnalyticFactory : NSObject 
{ 
    Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used. 
} 

nel file di implementazione (il file .m objc), è possibile importare il Xcode generato intestazione Swift file ("ProductModuleName-Swift.h") e l'implementazione corretta AnalyticProtocol sarà ora nota t o il compilatore.

questo è anche descritta nella sezione "Utilizzo di Swift dal Objective-C" nel Apple Docs

Nota che XCode darà un avvertimento nel file di intestazione objc quando si utilizza il protocollo avanti dichiarato ("Non riesci a trovare il protocollo definizione per 'AnalyticProtocol'), ma questo può essere ignorato - l'implementazione sarà trovata in fase di compilazione

+11

Perché Xcode mostra l'avviso per il protocollo mancante quando compila e funziona correttamente? Un modo per rimuovere l'avviso? – Oren

Problemi correlati