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")
}