Noop for Swift's Exhaustive Switch Statements

87

Swift nécessite des instructions de commutation exhaustives et que chaque cas ait un code exécutable.

L'étiquette 'case' dans un 'commutateur' doit avoir au moins une instruction exécutable

Quelqu'un at-il trouvé une bonne manière de gérer les cas où vous ne voulez rien faire? Je peux mettre un println () là-dedans, mais cela semble sale.

Sean McMains
la source

Réponses:

149

Selon le livre , vous devez y utiliser break:

La portée de chaque cas ne peut pas être vide. Par conséquent, vous devez inclure au moins une instruction après les deux points (:) de chaque étiquette de cas. Utilisez une seule breakinstruction si vous n'avez pas l'intention d'exécuter du code dans le corps d'un cas correspondant.

dasblinkenlight
la source
8
Oh, encore une fois, Swift enfreint la loi de la surprise minimale :)
Sulthan
10
@Jiaaro Le besoin de breakindique que les branches sans breakrisque de tomber.
RnMss le
4
Un simple ()wokrs aussi. Néanmoins je préfère breakcar cela rend les choses plus claires. Utilisez le mot-clé fallthrougpour passer à travers les déclarations.
cLar le
1
C'est assez ennuyeux quand vous voulez commenter brièvement la seule ligne qui est dans le default:cas. Cela ne semble pas une bonne chose. Je suis également d'accord pour dire que cela suggère la chute du comportement de c, ce qui n'est pas ce que fait Swift (c'est bien de savoir que cela peut tomber).
Benjohn
1
Et je devais venir ici juste pour m'assurer que la pause n'allait pas quitter une boucle englobante plus tôt ..
JulianSymes
12

Vous pouvez utiliser une breakinstruction:

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

Exemple modifié à partir de la documentation

Firo
la source
3

Voici une option pour l'instruction null, mais peut-être pas une bonne solution. Je ne trouve pas de déclaration comme python pass

{}() 

pour le boîtier de commutation, la pause est un meilleur choix.

break
lbweek
la source
0

En plus de ce qui est breakmentionné dans d'autres réponses, j'ai également vu ()utilisé comme une déclaration de non-opération:

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

À utiliser ()si vous trouvez breakdéroutant ou si vous souhaitez enregistrer 3 caractères.

pkamb
la source
-1

La solution la plus propre que j'ai trouvée consiste simplement à inclure votre dernière déclaration dans le boîtier du commutateur par défaut. Cela évite d'avoir à ajouter breakou d'autres déclarations inutiles tout en couvrant tous les cas possibles.

Par exemple:

switch myVar {

case 0:
    myOtherVar = "Red"

case 1:
    myOtherVar = "Blue"

default:
    myOtherVar = "Green"

}
Scottyhardy
la source
1
Salut @scottyhardy. Ce n'est vraiment pas le but de la question. Vous avez écrit la réponse à la question: "Comment éviter d'avoir à ajouter un cas par défaut vide" (ou quelque chose du genre). Dans votre cas, vous faites réellement quelque chose dans tous les cas. Mais disons que vous avez un cas (comme le numéro 2 par exemple) où vous ne voulez rien faire, alors dans ce cas vous revenez à la même question: que faire quand dans un cas de changement on ne veut pas faire n'importe quoi? Longue histoire courte: utilisez la pause.
Enricoza