values switch enum computed enums swift

enums - switch - Igualdad en Objective-C typedef enum en Swift



switch self swift (4)

Estoy trabajando con el SDK de Objective-C de Facebook en Swift y estoy tratando de comparar un valor de FBSessionState con un valor de la enumeración. Sin embargo, obtengo el error del compilador:

No se pudo encontrar una sobrecarga para ''=='' que acepta los argumentos proporcionados

Básicamente, estoy tratando de lograr:

if state == FBSessionStateOpen { ... }

Puedo solucionar esto comparando con el valor ...

if state.value == FBSessionStateOpen.value { ... }

Pero me pregunto si hay una manera de hacer que esto funcione más como una enum de Swift.


Swift mapea automáticamente las enumeraciones Obj-C a su propio estilo de estructura enumName.caseName . Por ejemplo, si la enum se llama FBSessionState y existe el caso FBSessionStateOpen , se asignará como FBSessionState.Open en Swift.

El operador == trabajará para comparar enums de Swift.


Puede desenvolver la enumeración y las constantes con ''.value'' para obtener el entero subyacente, que debe ser conmutable:

switch x.value { case Foo.value: }

Tal vez esto es un error y Apple lo soluciona en versiones futuras.


Con la actualización Beta4, la solución .value ya no funciona. No parece haber otra solución fácil sin cambiar el SDK de Facebook.

Cambié todas las enumeraciones de Facebook para usar la macro NS_ENUM, para que pueda usar la sintaxis de Swift en las enumeraciones.

if FBSession.activeSession().state == .CreatedTokenLoaded

Estos cambios se fusionaron en el fork de Facebook de pgaspar , que incluye otras soluciones para la compatibilidad con Swift.

pod ''Facebook-iOS-SDK'', :git => ''https://github.com/pgaspar/facebook-ios-sdk.git''


Agregando a la respuesta de Nikolai Nagorny, esto es lo que funcionó para mí:

if (device.deviceType.value == TYPE_BLUETOOTHNA.value)