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).