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.

Sean McMains
fuente

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.

Sergey Kalinichenko
fuente
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

Firo
fuente
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
libras semanales
fuente
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"

}
Scottyhardy
fuente
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.

pkamb
fuente