Noop для исчерпывающих заявлений о переключении Swift

88

Swift требует исчерпывающих операторов switch и чтобы в каждом случае имелся исполняемый код.

Метка case в переключателе должна иметь хотя бы один исполняемый оператор

Кто-нибудь нашел хороший способ справиться со случаями, когда вы на самом деле ничего не хотите делать? Я могу поместить туда println (), но это кажется грязным.

Шон МакМейнс
источник

Ответы:

150

По книге там нужно использовать break:

Объем каждого дела не может быть пустым. В результате вы должны включить как минимум один оператор после двоеточия (:) каждой метки case. Используйте один breakоператор, если вы не собираетесь выполнять какой-либо код в теле совпадающего кейса.

Сергей Калиниченко
источник
8
О, снова Свифт нарушает закон минимума сюрпризов :)
Sulthan
10
@Jiaaro Необходимость breakуказывает на то, что ветви без него breakмогут провалиться.
RnMss
4
И простые ()работники тоже. Тем не менее я предпочитаю, breakпоскольку это проясняет ситуацию. Используйте ключевое слово, fallthrougчтобы пропустить утверждения.
cLar
1
Это очень раздражает, когда вы хотите кратко закомментировать единственную строку, которая в этом default:случае. Это не похоже на хорошее. Я также согласен с тем, что это наводит на мысль о провале c, а это не то, что делает Swift (хотя приятно знать, что он может провалиться).
Benjohn
1
И мне пришлось приехать сюда только для того, чтобы убедиться, что перерыв не
приведет к
12

Вы можете использовать breakинструкцию:

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

Пример изменен из документации

Firo
источник
3

Ниже приведен один вариант для нулевого оператора, но, возможно, это не очень хорошее решение. Я не могу найти такое выражение, как python pass

{}() 

Для корпуса переключателя перерыв - лучший выбор.

break
фунт в неделю
источник
0

Самое чистое решение, которое я нашел, - просто включить последний оператор в case switch по умолчанию. Это позволяет избежать добавления breakили других ненужных утверждений, но при этом охватывает все возможные случаи.

Например:

switch myVar {

case 0:
    myOtherVar = "Red"

case 1:
    myOtherVar = "Blue"

default:
    myOtherVar = "Green"

}
Скоттихарди
источник
1
Привет @scottyhardy. Вопрос действительно не в этом. Вы написали ответ на вопрос: «Как избежать добавления пустого регистра по умолчанию» (или чего-то подобного). В вашем случае вы действительно что-то делаете во всех случаях. Но предположим, что у вас есть случай (например, номер 2), в котором вы не хотите ничего делать, тогда в этом случае вы возвращаетесь к тому же вопросу: что делать, когда в случае переключателя мы не хотим делать что-либо? Короче говоря: используйте перерыв.
Энрикоса
0

В дополнение к breakупомянутому в других ответах я также видел, что он ()используется в качестве оператора без операции:

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

Используйте, ()если вас breakсбивает с толку или вы хотите сохранить 3 символа.

пкамб
источник