У цій статті ви навчитеся використовувати оператор гвардії для управління потоком виконання вашої програми.
Заява Swift If описує, як можна виконувати дії на основі певної умови (логічне значення). У цій статті ми розглянемо переваги оператора guard над оператором if для управління потоком програми та написання більш простого та чистого коду.
Заява швидкої охорони
Основним використанням інструкції гвардії є передача контролю програми поза рамками на певних умовах. Ці оператори схожі на оператори if, які виконують оператори на основі певної умови (логічне значення), але на відміну від if, інструкції-захисники виконуються лише тоді, коли певні умови не виконуються.
Більше того, заяви всередині охорони повинні виходити за межі зони дії. Тому ми повинні керуючі оператори програми користувача return
, break
, continue
або throw
в кінці захисного заяви.
Синтаксис заяви гвардії
вираз-захист else (// висловлювання // повинно містити вираз керування: повернення, перерва, продовження чи кидання.)
- Тут вираз є булевим виразом (повертає або
true
абоfalse
). - Якщо вираз обчислюється
false
,guard
виконуються оператори всередині кодового блоку . - Якщо вираз обчислюється
true
, оператори всередині блоку кодуguard
пропускаються з виконання.
Як працює заява охорони?
Примітка: Кінець захисного заяви повинен містити контрольне заяву return
, break
, continue
або throw
.
Приклад 1: Як працює заява-охорона?
Просте дійсне висловлення охорони наведено нижче:
guard true else ( print("Condition not met") ) print("Condition met")
Коли ви запускаєте програму, результат буде:
Умова виконана
У наведеній вище програмі гвардія містить логічне значення true (умова виконана). Оскільки оператори захисту виконуються лише тоді, коли умова не виконується, інструкція всередині функції захисту не виконується. Ось чому print("Condition met")
виконується і виводиться умова на екран.
Тепер давайте змінимо умову на false як:
Приклад 2: інструкція гвардії повинна вийти з області дії
guard false else ( print("Condition not met") ) print("Condition met")
У наведеній вище програмі стан охорони оцінюється як false
. Отже, оператор print("Condition not met")
усередині else повинен виконуватися. Але ви отримаєте помилку із повідомленням , що тіло "охоронця" може не провалитися, подумайте про використання "return" або "throw" для виходу з області дії.
Повідомлення про помилку в простих засобів слів, вам потрібно передати управління програмою з захисного заяви з використанням return
, break
, continue
або throw
заяви. Поки що ми збираємося використовувати return
. І оскільки return
оператор може бути використаний лише всередині функції, ми збираємось обернути вищезазначений код у швидких функціях.
Приклад 3: оператор гвардії всередині функції
Ми можемо використовувати інструкцію гвардії всередині функції у Swift як:
func someFunction() ( guard false else ( print("Condition not met") return ) print("Condition met") ) someFunction() print("Hello after function call")
Коли ви запускаєте вищезазначену програму, результат буде:
Умова не виконана Привіт після виклику функції
У наведеній вище програмі стан захисту обчислюється як false
, отже, оператори всередині охорони виконуються. Перший оператор print("Condition not met")
виводить умову не виконано в консолі.
І оператор return
припиняє виконання функції, і оператор print("Hello, after function call")
після виконання виклику функції, який виводить Hello після виклику функції в консолі.
Приклад 4: Охорона з опціонами
У Swift Optionals ми бачили використання if-let
для розгортання необов’язкового. Однак ми також можемо використовувати оператор охорони замість if-let
для розгортання необов’язкового з однією перевагою. Головною перевагою розгортання необов’язкового з захистом замість того if-let
, що ми можемо збільшити область розгортання змінної.
Побачимо це в прикладі нижче:
func changeOptionalStringToUpperCase() ( var name:String? guard let temp = name else ( print("Name is nil. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Коли ви запускаєте вищезазначену програму, результат буде:
Ім'я нуль. Не вдається обробити
У наведеній вище програмі ви можете бачити, що розгорнуте значення temp використовується поза межами області, визначеної оператором guard. Оскільки ім'я визначається необов'язково і містить значення nil, оператор guard не розгортає значення.
Отже, оператори в гвардії else виконують те, що друкує Ім'я - нуль. Не вдається обробити у вихідних даних і завершує функцію return
оператором. Еквівалентним кодом наведеного вище висловлювання оператора if-else є:
func changeOptionalStringToUpperCase() ( var name:String? if let temp = name ( print("Uppercased:(temp.uppercased())") ) else ( print("Name is nil. Cannot process") return ) //how to access temp here?? Solution:Use Guard ) changeOptionalStringToUpperCase()
Зверніть увагу, що вище два твердження є дійсними і виконують одну і ту ж роботу. Але використовуючи оператор if-let, ви не можете використовувати розгорнуте значення поза оператором if-let. Але за допомогою оператора guard ви можете використовувати розгорнуте значення через функцію out.
Приклад 5: Охорона з кількома умовами
Оператори Guard також можуть зв’язати кілька умов, розділених комами (,), як:
func changeOptionalStringToUpperCase() ( var name:String? = "" guard let temp = name , temp.count> 0 else ( print("Name is nil or an empty string. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Коли ви запускаєте вищезазначену програму, результат буде:
Ім'я - нуль або порожній рядок. Не вдається обробити
У наведеній вище програмі оператор гвардії містить дві умови, розділені комами.
Перша умова let temp = name
розгортає необов’язковий, який повертається true
в нашому випадку, а друга умова temp.count> 0
перевіряє, чи не розгорнута рядок має більше 0 символів, що обчислюється false
в нашому прикладі.
Отже, оператор усередині інструкції гвардії виконує оператор, print("Name is nil or an empty string. Cannot process")
який виводить Ім'я дорівнює нулю або порожній рядок. Не вдається обробити в консолі та завершує функцію return
оператором.