Достаточно ли сложен мой код для использования оператора switch в Swift? - PullRequest
1 голос
/ 07 июня 2019

Из документации Swift:

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

Я пытаюсь решить, буду ли яследует использовать операторы switch или if / else, основанные на наличии сложных условий.Таким образом, мой вопрос, является ли мое состояние сложным или нет.

Вот пример того, что у меня есть:

var sampleVar = Measurement(value: amount, unit: UnitLength.megameters)

if(type == "inches"){
     //do something
}
else if...

У меня от 5 до 15 возможных условий, которые я проверяю, так что это сделает его достаточно сложным, чтобы оправдать использование оператора switch?Или сложность основана на условии, а не на количестве условий?

1 Ответ

2 голосов
/ 07 июня 2019

Окончательный тест - просто записать оба и сравнить.

Когда switch лучше

Когда вы сталкиваетесь с ситуацией, которая предпочитает switch над/ else ladder, ваш код будет выглядеть следующим образом:


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() }

Не забывайте о полиморфизме!

По возможности, старайтесь разбить сложную логику переключения на динамические вызовы методовна объекте.Это позволяет вам разделить логику каждого случая на отдельный класс, где можно сгруппировать всю связанную логику.

...