¿Es posible usar Enum de Swift en Obj-C?

Estoy tratando de convertir algunas de mis clases de Obj-C a Swift. Y algunas otras clases de Obj-C siguen usando enum en esa clase convertida. Busqué en los documentos previos a la publicación y no pude encontrarlo o quizás me lo perdí. ¿Hay alguna forma de usar Swift enum en Obj-C Class? ¿O un enlace al documento de este problema?

Así es como declare mi enumeración en mi antiguo código Obj-C y el nuevo código Swift.

mi antiguo código Obj-C:

typedef NS_ENUM(NSInteger, SomeEnum) { SomeEnumA, SomeEnumB, SomeEnumC }; @interface SomeClass : NSObject ... @end 

mi nuevo Código Swift:

 enum SomeEnum: NSInteger { case A case B case C }; class SomeClass: NSObject { ... } 

Actualización: de las respuestas. No se puede hacer en Swift versión anterior a la 1.2. Pero según este Swift Blog oficial. En Swift 1.2 que se lanzó junto con XCode 6.3, puede usar Swift Enum en Objective-C agregando @objc delante de enum

A partir de Swift versión 1.2 (Xcode 6.3) puedes. Simplemente prefija la statement enum con @objc

 @objc enum Bear: Int { case Black, Grizzly, Polar } 

Desvergonzadamente tomado del Swift Blog


En Objective-C esto se vería como

 Bear type = BearBlack; switch (type) { case BearBlack: case BearGrizzly: case BearPolar: [self runLikeHell]; } 

De la guía Using Swift with Cocoa y Objective-C :

Una clase o protocolo Swift debe marcarse con el atributo @objc para que sea accesible y utilizable en Objective-C. […]

Tendrás acceso a cualquier cosa dentro de una clase o protocolo que esté marcado con el atributo @objc, siempre que sea compatible con Objective-C. Esto excluye las características exclusivas de Swift como las que se enumeran a continuación:

Genéricos Tuplas / Enumeraciones definidas en Swift / Estructuras definidas en Swift / Funciones de nivel superior definidas en Swift / Variables globales definidas en Swift / Typealiases definidas en Swift / Swift-estilo variadics / Tipos nesteds / Curried functions

Entonces, no, no puedes usar una enumeración Swift en una clase Objective-C.

Para expandir la respuesta seleccionada …

Es posible compartir enums de estilo Swift entre Swift y Objective-C utilizando NS_ENUM() .

Solo necesitan definirse en un contexto Objective-C usando NS_ENUM() y están disponibles usando la notación de puntos Swift.

Desde el uso de Swift con Cocoa y Objective-C

Swift importa como una enumeración Swift cualquier enumeración estilo C marcada con la macro NS_ENUM . Esto significa que los prefijos a los nombres de valores de enumeración se truncan cuando se importan a Swift, ya sea que estén definidos en frameworks del sistema o en código personalizado.

C objective

 typedef NS_ENUM(NSInteger, UITableViewCellStyle) { UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle }; 

Rápido

 let cellStyle: UITableViewCellStyle = .Default 

Si prefiere mantener los códigos ObjC tal como están, podría agregar un archivo de encabezado auxiliar en su proyecto:

 Swift2Objc_Helper.h 

en el archivo de encabezado agrega este tipo de enumeración:

 typedef NS_ENUM(NSInteger, SomeEnum4ObjC) { SomeEnumA, SomeEnumB }; 

Puede haber otro lugar en su archivo .m para realizar un cambio: para incluir el archivo de encabezado oculto:

 #import "[YourProjectName]-Swift.h" 

reemplace [YourProjectName] con su nombre de proyecto. Este archivo de encabezado expone todas las clases de @objc definidas por Swift, enum a ObjC.

Puede recibir un mensaje de advertencia sobre la conversión implícita del tipo de enumeración … Está bien.

Por cierto, podría usar este archivo auxiliar de cabecera para mantener algunos códigos ObjC, como #definir constantes.

Si usted (como yo) realmente desea hacer uso de las enumeraciones de cadenas, puede crear una interfaz especializada para Object-C. Por ejemplo:

 enum Icon: String { case HelpIcon case StarIcon ... } // Make use of string enum when available: public func addIcon(icon: Icon) { ... } // Fall back on strings when string enum not available (objective-c): public func addIcon(iconName:String) { addIcon(Icon(rawValue: iconName)) } 

Por supuesto, esto no le dará la conveniencia de autocompletar (a menos que defina constantes adicionales en el entorno objective-c).