Noop para as exaustivas declarações de switch de Swift

87

O Swift requer instruções de switch exaustivas e que cada caso tenha um código executável.

O rótulo 'case' em um 'switch' deve ter pelo menos uma instrução executável

Alguém definiu uma boa maneira de lidar com os casos em que você realmente não quer fazer nada? Posso colocar um println () lá, mas parece sujo.

Sean McMains
fonte

Respostas:

149

De acordo com o livro , você precisa usar breaklá:

O escopo de cada caso não pode estar vazio. Como resultado, você deve incluir pelo menos uma instrução após os dois pontos (:) de cada etiqueta case. Use uma única breakinstrução se você não pretende executar nenhum código no corpo de um caso correspondente.

dasblinkenlight
fonte
8
Oh, mais uma vez, o Swift quebra a lei da surpresa mínima :)
Sulthan
10
@Jiaaro A necessidade de breakindica que os galhos de fora breakpodem cair.
RnMss
4
Um trabalho simples ()também. No entanto, prefiro breakporque torna as coisas mais claras. Use a palavra fallthroug- chave para cair nas declarações.
cLar
1
Isso é muito irritante quando você deseja comentar brevemente a única linha que está no default:caso. Isso não parece uma coisa boa. Também concordo que é sugestivo de comportamento de queda de c, o que não é o que Swift faz (no entanto, é bom saber que pode falhar).
Benjohn
1
E eu tive que vir aqui apenas para ter certeza de que o intervalo não iria encerrar um loop fechado mais cedo ..
JulianSymes
12

Você pode usar uma breakdeclaração:

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

Exemplo modificado dos documentos

Firo
fonte
3

Abaixo está uma opção para instrução nula, mas talvez não seja uma boa solução. Não consigo encontrar uma declaração como python pass

{}() 

para caso de switch, break é a melhor escolha.

break
lbsweek
fonte
0

Além de break mencionado em outras respostas, também vi ()usado como uma declaração autônoma:

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

Use ()se achar breakconfuso ou quiser salvar 3 caracteres.

pkamb
fonte
-1

A solução mais limpa que encontrei é simplesmente incluir sua última declaração no caso do switch como seu padrão. Isso evita a necessidade de adicionarbreak ou outras instruções desnecessárias, ao mesmo tempo que cobre todos os casos possíveis.

Por exemplo:

switch myVar {

case 0:
    myOtherVar = "Red"

case 1:
    myOtherVar = "Blue"

default:
    myOtherVar = "Green"

}
Scottyhardy
fonte
1
Olá, @scottyhardy. Esse não é realmente o ponto da questão. Você escreveu a resposta para a pergunta: "Como evitar ter que adicionar uma caixa padrão vazia" (ou algo parecido). No seu caso, você está realmente fazendo algo em todos os casos. Mas digamos que você tenha um caso (como o número 2, por exemplo) em que não quer fazer nada, então, nesse caso, você volta à mesma pergunta: o que fazer quando em um caso de troca não queremos para fazer qualquer coisa? Resumindo: use a pausa.
Enricoza