Obtenga el valor asociado de la enumeración sin interruptor / caja

Tengo una enumeración con algunos casos diferentes que son tipos diferentes, por ejemplo

enum X { case AsInt(Int) case AsDouble(Double) } 

Puedo switch estos muy bien para recuperar el valor subyacente. Sin embargo, la instrucción switch es muy molesta al tratar de hacer que ejecute algún código para los otros casos que simplemente no me importa. Por ejemplo, ahora mismo tengo algo así como

 func AsInt(x: X) -> Int? { switch x { case AsInt(let num): return num; default: return nil; } } 

Esto funciona, pero es bastante tedioso tener siempre que hacer referencia a este método y tener que escribir uno nuevo para cada caso de cada enumeración. Lo que estoy buscando es cómo intentar lanzar un valor de tipo X a uno de los casos, como

 var object: X = func(); let value = obj as? Int; if value { // do shit } 

¿Cómo puedo simplemente buscar un caso sin tener que enumerar todos los casos sobre los que no me importa y ejecutar algún tipo de statement para ellos?

Puntos de bonificación por cualquier solución que pueda declarar value como parte del condicional en lugar de contaminar el scope.

En realidad, hay múltiples formas de hacerlo.

Hagámoslo ampliando su enumeración con una propiedad calculada:

 enum X { case asInt(Int) case asDouble(Double) var asInt: Int? { // ... see below } } 

Soluciones con if case

Al let afuera:

 var asInt: Int? { if case let .asInt(value) = self { return value } return nil } 

Al let entrar:

 var asInt: Int? { if case .asInt(let value) = self { return value } return nil } 

Soluciones con guard case

Al let afuera:

 var asInt: Int? { guard case let .asInt(value) = self else { return nil } return value } 

Al let entrar:

 var asInt: Int? { guard case .asInt(let value) = self else { return nil } return value } 

El último es mi syntax favorita personal de las cuatro soluciones.

A partir de Swift 2 (Xcode 7) esto es posible con if/case y coincidencia de patrones:

 let x : X = ... if case let .AsInt(num) = x { print(num) } 

El scope de num está restringido a la instrucción if.