Estoy tratando de convertir parte de mi clase de Obj-C a Swift. Y algunas otras clases de Obj-C todavía usan enum en esa clase convertida. Busqué en los documentos de prelanzamiento y no pude encontrarlo o tal vez lo perdí. ¿Hay alguna manera de usar Swift enum en Obj-C Class? ¿O un enlace al documento de este número?
Así es como declaró 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 la versión anterior de Swift que la 1.2. Pero según este blog oficial de Swift . En Swift 1.2 que se lanzó junto con XCode 6.3, puede usar Swift Enum en Objective-C agregando @objc
delante deenum
objective-c
enums
swift
myLifeasdog
fuente
fuente
Respuestas:
A partir de la versión 1.2 de Swift (Xcode 6.3) puede hacerlo. Simplemente prefija la declaración enum con
@objc
Descaradamente tomado del Blog Swift
En Objective-C esto se vería así
fuente
BearBlack
,BearGrizzly
yBearPolar
!Para ampliar la respuesta seleccionada ...
Es posible compartir enumeraciones de estilo Swift entre Swift y Objective-C usando
NS_ENUM()
.Solo necesitan definirse en un contexto Objective-C usando
NS_ENUM()
y están disponibles usando la notación de puntos Swift.Del uso de Swift con cacao y Objective-C
C objetivo
Rápido
fuente
if let a = MyEnum(rawValue: 12345)
donde 12345 no es parte de esa enumeración, el resultado no es opcional sino una enumeración no válida.De la guía Uso de Swift con cacao y Objective-C :
Entonces, no, no puedes usar una enumeración Swift en una clase Objective-C.
fuente
@objc
como @DanielGalasko señaló en su respuesta a continuación.@obj enum MyEnum: Int
que funcionará bien en archivos Objective-C como se mencionó anteriormente. Si su enumeración se declara con otro tipo de valor sin@obj enum MyOtherEnum: String
formato como , no podrá usarla en archivos Objective-CSwift 4.1, Xcode 9.4.1:
1) Swift enum debe tener el prefijo
@objc
y serInt
type:2) El nombre de Objective-C es enum name + case name, por ejemplo
CalendarPermissionAuthorized
:Y, por supuesto, recuerde importar su encabezado de puente Swift como último elemento en la lista de importación del archivo Objective-C:
fuente
Si prefiere mantener los códigos ObjC tal como están, puede agregar un archivo de encabezado auxiliar en su proyecto:
en el archivo de encabezado agregue este tipo de enumeración:
Puede haber otro lugar en su archivo .m para hacer un cambio: para incluir el archivo de encabezado oculto:
reemplace [YourProjectName] con el nombre de su proyecto. Este archivo de encabezado expone todas las clases @objc definidas por Swift, enumeraciones 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 encabezado para mantener algunos códigos ObjC como #define constantes.
fuente
Si usted (como yo) realmente quiere utilizar las enumeraciones de String, puede crear una interfaz especializada para el objetivo-c. Por ejemplo:
Por supuesto, esto no le dará la conveniencia de autocompletar (a menos que defina constantes adicionales en el entorno del objetivo-c).
fuente
esto podría ayudar un poco más
Planteamiento del problema : - Tengo una enumeración en la clase rápida, a la que estoy accediendo desde otras clases rápidas, y ahora necesito acceder a ella desde mi clase C objetiva.
Antes de acceder desde la clase objetiva-c: -
Cambios para acceder desde la clase objetiva c
y agregue una función para pasarla al valor
fuente
Después de investigar esto, seguí encontrando solo respuestas parciales, así que creé un ejemplo completo de una aplicación Swift unida al Objetivo C que tiene enumeraciones Swift utilizadas por el código Objective C y enumeraciones Objective C utilizadas por el código Swift. Es un proyecto Xcode simple con el que puede ejecutar y experimentar. Fue escrito usando Xcode 10.3 con Swift 5.0
Proyecto de ejemplo
fuente
enum SwAnimal
carece de los principales@obj
En caso de que esté tratando de observar una enumeración que se ve así:
Esta solución me ayudó.
Clase observable:
@objc dynamic var observable: String?
cree su instancia de enumeración de esta manera:
Clase de observador:
private var _enumName: EnumName?
private let _instance = ObservableClass()
crear
De eso se trata. Ahora, cada vez que cambie el
_enumName
en la clase observable, también se actualizará inmediatamente una instancia apropiada en la clase observador.Por supuesto, esta es una implementación demasiado simplificada, pero debería darle una idea de cómo observar las propiedades incompatibles con KVO.
fuente