Как проверить все случаи в выражении switch в swift, используя ключевое слово where? - PullRequest
0 голосов
/ 14 ноября 2018

, когда я выполняю этот код, только print("it is greater than zero") выполняется, но у меня есть два случая, когда это правда, я пытался использовать ключевое слово fallthrough, но он выполняет следующий блок, даже если он ложный, независимо от того, что

, что, в свою очередь, поднимает другой вопрос, когда мне следует использовать ключевое слово fallthrough?если я хочу принудительно выполнить следующий блок, почему бы просто не вставить код в тот же блок, где находится fallthrough?

Есть ли способ, что приведенный ниже пример может напечатать все случаи, которые оцениваются как истинные ивсе еще исключаете все случаи, которые оцениваются как ложные?

let number = 1

switch number {
case _ where number > 0:
    print("it is greater than zero")
case _ where number < 2:
    print("it is less than two")
case _ where number < 0:
    print("it is less than zero")
default:
    print("default")
}

Заранее благодарим вас за ваши ответы!

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы правы, что fallthrough означает "выполнить следующий случай без проверки его истинного значения".

Таким образом, если вы хотите выполнить первый и второй случаи только в ситуации, когда оба являются истинными, вы должны выполнить вторую проверку как часть первого случая. Таким образом, минимальное изменение вашего кода будет:

let number = 1
switch number {
case _ where number > 0:
    print("it is greater than zero")
    if number < 2 { fallthrough } // <--
case _ where number < 2:
    print("it is less than two")
case _ where number < 0:
    print("it is less than zero")
default:
    print("default")
}

Однако я бы не писал этот конкретный пример. И в любом случае вы все еще сталкиваетесь с проблемой того, что должно произойти, когда число, скажем, равно -1; это меньше, чем 2, но также меньше, чем 0, поэтому вы снова столкнулись с той же проблемой. Из твоего вопроса совсем не очевидно, какая здесь реальная цель! Если это действительно три вещи, которые вы хотите обнаружить, лучше использовать два отдельных теста, поскольку они не связаны друг с другом. Например:

let number = 1
switch number {
case ..<0:
    print("it is less than zero")
case 0...:
    print("it is zero or greater")
default: break
}
switch number {
case ..<2:
    print("it is less than two")
default: break
}
0 голосов
/ 14 ноября 2018

Оператор switch не предназначен для этой цели и не работает таким образом. Намерен найти единственно верный случай. Если вы хотите проверить несколько случаев, это просто оператор if:

let number = 1

if number > 0 {
    print("it is greater than zero")
}
if number < 2 {
    print("it is less than two")
}
if number < 0 {
    print("it is less than zero")
}

Для этого нет эквивалента switch. Это разные операторы управления.

Как вы обнаружили, fallthrough существует, чтобы позволить двум случаям запускать один и тот же блок. Вот для чего это; он не проверяет другие случаи. Как правило, если вы широко используете case _, вы, вероятно, неправильно используете switch в Swift и должны использовать if.

...