objective c - ¿Es posible usar Enum de Swift en Obj-C?
objective-c enums (5)
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 declaración 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 anidados / 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 objetivo
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 objetivo-c).