If (Если) и Switch (Переключатель)
If — оператор проверки условия, если истинно — выполняется код, если нет — выполняется код из блока else, если он есть. Так же можно составлять подряд несколько условий (else if), но в этом случае разумней использовать оператор switch
1 2 3 4 5 6 7 8 9 |
if i > 5 { print ("i > 5") } else if i < 2 { print ("i < 2") } else { print ("2 <= i <= 5") } |
Switch, в русском языке не переводят, никто не говорит переключатель, switch — он и в африке свич. Но суть оператора — в переключении пути выполнения кода в зависимости от содержимого переменной в блоке условия
Этот оператор стал намного более гибким, я приведу кусок кода в котором постараюсь описать интересные моменты
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
var point = (81, 81) switch point { case (1, 5), (3, 6): //1 print("Точка равна (1,5) или (3,6)") case (7..<14, 10): //2 print("x = {7,8,9}, y = 10)") case (_, 10): //3 print("Любой x, y = 10") case (let x, 5): //4 print("x = \(x), y = 5") case (let x, let y) where x == y: //6 print("x == y (\(x))") fallthrough //5 default: //7 if point.0 == point.1 { print ("равны") break //8 } print ("Не напечатается") } |
Главное отличие от C и Objective-C — необязательно после операторов внутри case ставить break, т.к. после выполнения кода в определенном case, — мы прекращаем выполнение, а не переходим к следующему case
1) Если несколько значений должны привести к выполнению одного и того же куска кода — перечисляем их через запятую.
2) Позволяется использовать интервалы
3) Позволяет игнорировать часть данных с помощью символа подчеркивания
4) Позволяет присваивать в переменную текущее значение и использовать ее в коде (и т.к. никаких доп условий нет, получается что x — любая)
5) Позволяет делать сложные сравнения для данных с помощью оператора where
6) Чтобы вернуть поведение как в C и после выполнение кода в конкретном case — продолжить проверять следующие случаи добавили команду fallthrough
7) switch обязан покрывать все возможные значения, если убрать default из этого кода — получим ошибку
8) в любой момент можно выйти из switch с помощью команды break
Ну и возвращаясь к полному покрытию.
1 2 3 4 5 6 7 8 9 10 11 12 |
enum en { case a case b } var varEnum : en = en.a switch varEnum { case en.a: print(1) //case en.b: // print (2) } |
Этот код выдаст ошибку, но только в Swift 1.2.
Если раскомментировать case en.b — ошибка исчезнет, т.к. теперь все возможные значения будут обработаны (без использования default).
Если switch нужен для обработки только части значений, а остальные не важны, нужно использовать default
Так же в Swift 2.0 расширили Enumeration Case Pattern и на if, позволяющий обрабатывать на лету частные случаи enum — if case
Swift 2.0: Enumeration Case Pattern (Паттерн выбора перечисления)