with values switch parameter enum computed swift enums switch-statement optional

values - Swift: prueba contra el valor opcional en la caja del interruptor



switch self swift (2)

A partir de Xcode 7 (de las notas de la versión beta 1), ¿una nueva x? el patrón se puede usar para emparejar patrones con opcionales como sinónimo de .Some(x) . "Esto significa que en Xcode 7 y posterior, la siguiente variación de la respuesta de rintaro también funcionará:

switch someOptional { case someValue?: print("the value is /(someValue)") case let val?: print("the value is /(val)") default: print("nil") }

En Swift, ¿cómo puedo escribir un caso en una declaración de cambio que pruebe el valor que se cambia con respecto al contenido de una opción , omitiendo el caso si el opcional contiene nil ?

Así es como me imagino que esto podría verse:

let someValue = 5 let someOptional: Int? = nil switch someValue { case someOptional: // someOptional is non-nil, and someValue equals the unwrapped contents of someOptional default: // either, someOptional is nil, or someOptional is non-nil but someValue does not equal the unwrapped contents of someOptional }

Si lo escribo exactamente así, el compilador se queja de que someOptional no está someOptional , ¡pero si lo desenvuelvo explícitamente al agregarlo ! Hasta el final, por supuesto obtengo un error de tiempo de ejecución cada vez someOptional contiene nil . Agregar ? en lugar de ! tendría algún sentido para mí (en el espíritu del encadenamiento opcional, supongo), pero no hace desaparecer el error del compilador (es decir, no desenvuelve realmente el opcional).


Opcional es solo una enum como esta:

enum Optional<T> : Reflectable, NilLiteralConvertible { case None case Some(T) // ... }

Para que pueda unirlos como patrones de coincidencia de "valores asociados" habituales:

let someValue = 5 let someOptional: Int? = nil switch someOptional { case .Some(someValue): println("the value is /(someValue)") case .Some(let val): println("the value is /(val)") default: println("nil") }

Si quieres someValue de someValue , usando la expresión de guardia :

switch someValue { case let val where val == someOptional: println(someValue) default: break }

Y para Swift> 2.0

switch someValue { case let val where val == someOptional: print("matched") default: print("didn''t match; default") }