Noop para las exhaustivas declaraciones de Swift


88

Swift requiere declaraciones de cambio exhaustivas y que cada caso tenga un código ejecutable.

La etiqueta 'case' en un 'switch' debe tener al menos una declaración ejecutable

¿Alguien se ha decidido por una buena forma de manejar los casos en los que no quieres hacer nada? Puedo poner un println () ahí, pero se siente sucio.


Respuestas:


150

Según el libro , debe usar breakallí:

El alcance de cada caso no puede estar vacío. Como resultado, debe incluir al menos una declaración después de los dos puntos (:) de cada etiqueta de caso. Use una sola breakdeclaración si no tiene la intención de ejecutar ningún código en el cuerpo de un caso coincidente.


8
Oh, nuevamente Swift rompe la ley de la sorpresa mínima :)
Sulthan

10
@Jiaaro La necesidad de breakindica que las ramas sin breakpodrían fallar.
RnMss

4
Un trabajo simple ()también. Sin embargo prefiero breakporque deja las cosas más claras. Utilice la palabra clave fallthrougpara pasar por las declaraciones.
cLar

1
Esto es bastante molesto cuando desea comentar brevemente la única línea que está en el default:caso. Eso no parece nada bueno. También estoy de acuerdo en que sugiere el comportamiento de caída de c, que no es lo que hace Swift (aunque es bueno saber que puede fallar).
Benjohn

1
Y tuve que venir aquí solo para asegurarme de que la ruptura no iba a salir de un bucle de cierre temprano ..
JulianSymes

12

Puede utilizar una breakdeclaración:

let vegetable = "red pepper"
var vegetableComment: String = "Nothing"
switch vegetable {
case "cucumber", "watercress":
    break // does nothing
case let x where x.hasSuffix("pepper"):
    vegetableComment = "Is it a spicy \(x)?"
default:
    vegetableComment = "Everything tastes good in soup."
}

Ejemplo modificado de los documentos


3

A continuación se muestra una opción para la declaración nula, pero tal vez no sea una buena solución. No puedo encontrar una declaración como Python Pass

{}() 

Para el caso del interruptor, romper es una mejor opción.

break

0

La solución más limpia que he encontrado es simplemente incluir su última declaración en el caso del interruptor como predeterminado. Esto evita la necesidad de agregar breaku otras declaraciones innecesarias al tiempo que cubre todos los casos posibles.

Por ejemplo:

switch myVar {

case 0:
    myOtherVar = "Red"

case 1:
    myOtherVar = "Blue"

default:
    myOtherVar = "Green"

}

1
Hola @scottyhardy. Este no es realmente el punto de la pregunta. Escribiste la respuesta a la pregunta: "Cómo evitar tener que agregar un caso predeterminado vacío" (o algo por el estilo). En su caso, en realidad está haciendo algo en todos los casos. Pero digamos que tiene un caso (como el número 2, por ejemplo) en el que no quiere hacer nada, luego, en ese caso, vuelve a la misma pregunta: qué hacer cuando en un caso de interruptor no queremos ¿hacer cualquier cosa? Para resumir: usa el descanso.
Enricoza

0

Además de lo breakmencionado en otras respuestas, también lo he visto ()utilizado como una declaración de no operación:

switch 0 == 1 {
case true:
    break
case false:
    ()
}

Úselo ()si le resulta breakconfuso o desea guardar 3 caracteres.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.