Noop для вичерпних тверджень Swift


88

Swift вимагає вичерпних операторів перемикання, і щоб кожен випадок мав виконуваний код.

Мітка 'case' у 'switch' повинна мати принаймні один виконуваний оператор

Хтось зупинився на хорошому способі розгляду справ, коли ви не хочете нічого робити? Я можу помістити туди println (), але це відчуває себе брудно.


Відповіді:


150

Згідно з книгою , вам потрібно використовувати breakтам:

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


8
О, знову Свіфт порушує закон мінімального сюрпризу :)
Султан

10
@Jiaaro Потреба в breakвказує на те, що гілки без breakможуть провалитися.
RnMss

4
Простий ()вокер - теж. Проте я віддаю перевагу, breakоскільки це робить речі більш зрозумілими. Використовуйте ключове слово, fallthrougщоб переглядати твердження.
cLar

1
Це досить дратує, коли ви хочете коротко прокоментувати єдиний рядок, який є у default:справі. Це не здається хорошою справою. Я також погоджуюся, що це наводить на думку про падіння c через поведінку, що не те, що робить Свіфт (приємно знати, що воно може провалитися).
Benjohn,

1
І я повинен був приїхати сюди лише для того, щоб переконатись, що перерва не збирається рано виходити із замкнутого циклу ..
JulianSymes

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

Приклад змінено з документів


3

Нижче наведено один із варіантів нульового твердження, але, можливо, це не найкраще рішення. Я не можу знайти таке твердження, як python pass

{}() 

для корпусу вимикача кращий вибір - перерва.

break

0

Найчистішим рішенням, яке я знайшов, є просто включити останню заяву до справи перемикача як стандартну. Це дозволяє уникнути необхідності додавання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 символи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.