2015-11-02 1 views

risposta

17

Quello che vuoi fare è chiamato forward declaration. Per inoltrare dichiarare un enum si può fare:

enum name; 

Ma dal momento che il compilatore non conoscere la dimensione della enum, sarà solo in grado di usarlo come un puntatore nel file di intestazione. Anche questo potrebbe rivelarsi problematico se si usano flag di compilazione come -pedantic.

Quindi, in breve, non c'è un buon modo per farlo. La tua migliore scommessa è di non farlo, e invece accedi all'enum dal tuo file di implementazione (.m).

Nel file di implementazione, #import Swift colmare file di intestazione, e, senza conoscere maggiori dettagli circa il tuo problema, è possibile aggiungere le proprietà private che utilizzano l'enum come questo:

@interface MyObjCClassDefinedInTheHFile() 
    @property (nonatomic, assign) SomeSwiftEnum type; 
@end 

Spero che questo aiuti.

+4

D'accordo che nessuna buona risposta. La base di codice su cui sto lavorando è in flusso tra Swift e Objective C, quindi la mia soluzione qui era dichiarare l'enum in un file objc (piuttosto) appropriato, fino a quando non siamo completamente su Swift. È molto più semplice condividere enum tra objc e swift in questo modo, usando il file di intestazione del bridging. – Elise

+0

Esattamente, sfortunatamente potrebbe essere la soluzione migliore, specialmente se l'enum ha bisogno di avere così tanta visibilità all'interno del progetto. – raf

+4

Avanti dichiarando funziona: 'typedef SWIFT_ENUM (NSInteger, MyEnum);' – amleszk

-3

È possibile accedere enumerazioni Swift in Objective-C, ma solo se l'enumerazione viene dichiarata con una @objc di qualificazione, il che significa che deve essere di tipo Int.

+2

Giusto e l'ho fatto. Questo non lo renderà disponibile nell'intestazione tho. – Phil

+0

L'intestazione Obj-C deve '#include" -Swift.h "'. E 'quello di cui hai bisogno? – NRitH

+3

Non è possibile includere il file -Swift.h in un file di intestazione Objective-C. Puoi includerlo solo in un file di implementazione. – Phil

-1

enumerazioni sono una parte della rapida comunicazione Objective-C che non sempre funziona. Il fatto è che in Objective-C, le enumerazioni possono essere solo tipi primitivi (NSInteger per esempio).

In swift è possibile avere enumerazioni su più tipi, ad esempio String. Qual è una delle cose meravigliose di Swift.

Tuttavia, questi enumerri non verranno compilati in Objective-C perché non esiste un equivalente per essi. Quindi saranno semplicemente ignorati e non generati in questo file di intestazione che xcode crea per tutti i tuoi file rapidi. Questo si chiama Objective-C generato intestazione interfaccia: enter image description here

Ciò ha generato file contiene tutte le classi e le enumerazioni disponibili in Objective-C. È necessario contrassegnare tutto ciò che si desidera esporre in Objective-c con @objc o renderli public. Non hai bisogno di alcuna dichiarazione per farli funzionare, se hai questo.

Spero che questo ti aiuti a capire perché il tuo enum non è visibile in Objc. Fammi sapere se ha funzionato.

2

In OBJC misto - I progetti Swift il modo migliore per far funzionare le enumerazioni in entrambi i tipi di classi sarà quello di definire l'enum in un'intestazione OBJC e non in una classe rapida. enumerazioni rapide non possono essere utilizzate nei file di intestazione OBJC presi dalla risposta here

-1

Per quanto ne so, raf's answer è ancora corretto. La soluzione più pulita è semplicemente lasciare l'enum in un file Objective-C finché non avrai più bisogno di accedervi da un'intestazione Objective-C. Volevo offrire un'altra soluzione alternativa, però.

Nel mio caso sto gradualmente riscrivendo un grande progetto Objective-C in Swift e non mi interessa una soluzione imperfetta se mi consente di riscrivere più del mio codice in Swift. Quindi ho deciso di passare semplicemente l'enum all'Objective-C poichè è di tipo grezzo, Int o NSInteger a Objective-C. Ad esempio:

- (void)doSomethingWithType:(NSInteger)rawType { 
    if (rawType == ExampleTypeWhatever) { 
     // Do something 
    } // etc... 
} 

Quando chiamo questo metodo da Swift, tutto quello che devo fare è passare il .rawType, invece del valore enum attuale:

objcObject.doSomething(withType: ExampleType.whatever.rawValue) 

Questo mantiene cose abbastanza semplici su entrambi i lati e sarà facile da aggiornare una volta che doSomethingWithType: verrà riscritto in Swift.

-2

Io uso solo NSInteger come tipo di ritorno per entrambi i file di intestazione e implementazione. E quando hai bisogno di usare l'enum, prendi l'enum di let yourEnum = YourEnum(rawValue: Int(enumNSInteger)). Questo funziona per me.

5

typedef SWIFT_ENUM(NSInteger, MyEnum);

+0

ha funzionato perfettamente per me. – PashaN

+0

Perfetto, grazie! – KPM