Основи Swift. Оператори передачі управління switch case

Основи Swift. Оператори передачі управління switch case

Ми вже встигли вивчити умовні оператори та цикли. Окрім них у мові Swift є також оператор передачі управління switch case. Його можна розглядати як розширену форму умовного оператора if, у якій представлені всі можливі варіанти рішення, серед яких Swift повинен обрати єдине правильне.

У деяких ситуаціях необхідно реалізувати велику кількість різних варіантів виконання коду в залежності від можливого значення параметра. Звичайно, для цього можна використовувати розширений синтаксис оператора if, багаторазово повторюючи блоки else-if.

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

Кількість блоків case може бути довільною. Після кожного ключового слова case можна вказувати будь-яку кількість значень, відокремлюючи їх комами. Вказівки на значення закінчуються символом двокрапки, після якого знаходиться блок коду, який буде виконуватись.

Щоб запустити механізм перевірки умови необхідно вказати, яку змінну ми хочемо перевірити і додати в конструкцію switch case список всіх можливих значень цієї змінної. Swift знаходить значення, яке відповідає нашій змінній і виконує потрібний блок коду, після чого виходить з даного оператора. Наприклад:

let liveAlbums = 2
 
switch liveAlbums {
    case 0:
      print("You're just starting out")
 
    case 1:
      print("You just released iTunes Live From SoHo")
 
    case 2:
 	 	print("You just released Speak Now World Tour")
 
    default:
    	print("Have you done something new?")
}

Оператор передачі управління читається набагато простіше, ніж комбінація із декількох умовних операторів if-else.

Перевага застосування оператора switch case полягає в тому, що Swift забезпечує код вичерпними варіантами можливих рішень. У випадках, коли значення змінної не відповідає ні одній із заявлених умов, Xcode відмовиться компілювати програму. Наприклад, щоб «зловити» відсутність можливого значення змінної liveAlbums з нашого прикладу необхідно включити до складу оператора switch case команду default. Це хороша практика правильного використання оператора передачі керування, навіть якщо ви на 100% впевнені, що ваші дані знаходяться в межах заданого діапазону значень.

У мові Swift при роботі з оператором switch case досить часто застосовуються діапазони. Наприклад, давайте модифікуємо перевірку можливого значення нашої змінної з використанням оператора закритого діапазону:

let studioAlbums = 5
 
switch studioAlbums {
case 0...1:
    print("You're just starting out")
 
case 2...3:
    print("You're a rising star")
 
case 4...5:
    print("You're world famous!")
 
default:
    print("Have you done something new?")
}

Важливо: одним з нововведень мови Swift є відсутність завершальної команди break в кожній гілці оператора передачі управління switch case.

Конструкція switch case повинна бути повною, тобто містити інформацію про всі можливі значення параметра, що перевіряється. Це забезпечується в тому числі наявністю блоку default. Якщо цей блок не повинен містити жодного виконуваного коду, то просто розташуйте в ньому оператор break.

Оператор switch в Swift є одним з найдосконаліших серед подібних операторів інших мов програмування. Його можна використовувати для будь-яких типів даних, об’єктів і навіть кортежів (про останні ми писали у статті “Основи Swift. Умовні оператори”).

Після виконання коду, розташованого в блоці case, відбувається завершення роботи конструкції switch case. Однак у деяких випадках потрібно не завершувати роботу switch case, а перейти до виконання коду в наступному блоці case. Для цього в кінці блоку case вказується ключове слово fallthrough.

var level: Character = "Б"
 
switch level {
    case "А":
        print("Вимкнути всі електричні прилади")
        fallthrough
 
    case "Б":
        print("Закрити вхідні двері та вікна")
        fallthrough
 
    case "В":
        print("Дотримуватися спокою")
 
    default:
        break
}

За допомогою блоків case ми визначаємо перелік значень, які може прийняти вираз. В одному блоці case можна визначити навіть кілька можливих значень. Однак Swift дозволяє в межах одного блоку case вказати не тільки значення розглянутого параметра, але його залежність від якої-небудь умови. Цей функціонал реалізується за допомогою ключового слова where в блоці case.

let yetAnotherPoint = (1, -1)
 
switch yetAnotherPoint {
    case let (x, y) where x == y:
        print("(\(x),\(y)) is on the line x == y")
 
    case let (x, y) where x == -y:
        print("(\(x),\(y)) is on the line x == -y")
 
    case let (x, y):
        print("(\(x),\(y)) is just some arbitrary point")
}
 

Ключове слово where ставиться в блоці case після перерахування значень, а за ним слідує логічний вираз, який має повернути true або false.

Код в блоці case виконується у випадку, коли знайдено відповідне значення і умова where повернула true.

Для тестування декількох значень в одному й тому ж операторі switch можна використовувати кортежі. Кожен елемент кортежу може бути протестований з будь-якою величиною або з діапазоном величин. Так само ви можете використовувати ідентифікатор підкреслення (_) для перевірки відповідності будь-якій можливій величині. Приклад нижче бере точку з координатами (x, y), виражену у вигляді кортежу (Int, Int), і зараховує її до відповідної категорії:

 
let somePoint = (1, 1)
 
switch somePoint {
    case (0, 0):
        print("(0, 0) is at the origin")
 
    case (_, 0):
        print("(\(somePoint.0), 0) is on the x-axis")
 
    case (0, _):
        print("(0, \(somePoint.1)) is on the y-axis")
 
    case (-2...2, -2...2):
        print("(\(somePoint.0), \(somePoint.1)) is inside the box")
 
    default:
        print("(\(somePoint.0), \(somePoint.1)) is outside of the box")
}

Оператор switch в Swift дозволяє множинний збіг або перетин значень із декількох випадків. У нашому прикладі точка (0, 0) відповідає всім чотирьом умовам. Однак, якщо можливий збіг відразу з декількома шаблонами, то враховується тільки перший з них. Тобто точка (0, 0) буде задовольняти умову case (0, 0):, а інші умови будуть проігноровані.

Сьогодні ми розглянули оператор switch case, який є розширеною формою оператора if, але сприймається легше, аніж поєднання кількох умовних операторів if-else, тому він краще підходить для описання складних умов.

Джерело: Hacking with Swift

Читати ще: Основи Swift. Функції

Потрібен MVP, розробка під iOS, Android або прототип додатка? Ознайомтеся з нашим портфоліо і зробіть замовлення вже сьогодні!