Из документации Swift:
Typically, you use the if statement to evaluate simple conditions with only a few possible outcomes. The switch statement is better suited to more complex conditions with multiple possible permutations and is useful in situations where pattern matching can help select an appropriate code branch to execute.
Я пытаюсь решить, следует ли мне использовать переключатель или операторы if/else в зависимости от того, есть ли у меня сложное условие. Так что у меня вопрос, мое состояние сложное или нет.
Вот пример того, что у меня есть:
var sampleVar = Measurement(value: amount, unit: UnitLength.megameters)
if (type == "inches"){
//do something
}
else if...
У меня есть от 5 до 15 возможных условий, которые я проверяю, поэтому будет ли это достаточно сложным, чтобы оправдать использование оператора switch? Или сложность основана на условии, а не на количестве условий?
Правильно, я просто проверяю 5-15 возможных значений типа. Спасибо за ответ! Я думаю, что Switch легче читать, поэтому я пойду с ним.
Строка "inches" — это запах кода. Вероятно, вам следует использовать полиморфизм или, как минимум, перечисления или словари. smartflow.wordpress.com/2015/04/20/code-smell-stringly-typed
Вероятно, вам также будет лучше, если вы сможете преобразовать type в перечисление.
Никогда не слышал о "запахе кода" или "строчном коде". Спасибо за ответы, узнал что-то новое.





Окончательный тест — просто записать оба и сравнить.
switch лучшеКогда вы имеете дело с ситуацией, которая предпочитает switch лестнице if/else, ваш код будет выглядеть так:
if something == 1 {
foo()
} else if something == 2 {
bar()
} else if something == 3 {
baz()
} else {
quux()
}
Как видите, все скобки, повторяющиеся ключевые слова (else, if), повторяющиеся операторы == и повторяющиеся экземпляры одного и того же идентификатора (something) добавляют кучу шума с очень небольшой ценностью. Сравните с switch:
switch something {
case 1: foo()
case 2: bar()
case 3: baz()
default: quux()
}
if/else if/else лучшеВы обнаружите, что пишете переключатель, в котором переключаемая переменная на самом деле не очень часто совпадает, но вместо этого у вас есть набор предложений where, которые проверяют множество несвязанных условий. Сравнивать:
switch something {
case 1: foo()
case _ where case2_1() || case2_2(): bar()
case _ where case3(): baz()
case _ where case4(): quux()
}
против.
if something == 1 || case1() { foo() }
else if case2_1() || case2_2() { bar() }
else if case3() { baz() }
else if case4() { quux() }
По возможности старайтесь разбивать сложную логику переключения на динамические вызовы методов объекта. Это позволяет выделить логику каждого случая в отдельный класс, где можно сгруппировать всю связанную логику.
Чтобы уточнить, вы просто проверяете 5-15 различных возможных значений «типа»? Если да, то это звучит как типичный вариант использования
switch. Но, в конечном счете, правильный ответ — это то, что вам легче читать и поддерживать.