W tym artykule dowiesz się, jak używać instrukcji guard do kontrolowania przepływu wykonywania programu.
Instrukcja Swift If opisuje, w jaki sposób możesz wykonywać akcje na podstawie określonego warunku (wartość logiczna). W tym artykule omówimy zalety instrukcji guard w porównaniu z instrukcją if do kontrolowania przepływu programu i pisania prostszego i czystszego kodu.
Oświadczenie Swift Guard
Głównym zastosowaniem instrukcji guard jest przeniesienie kontroli programu poza zakres pod pewnymi warunkami. Instrukcje te są podobne do instrukcji if, które wykonują instrukcje na podstawie określonego warunku (wartość logiczna), ale w przeciwieństwie do if, instrukcje guard są uruchamiane tylko wtedy, gdy nie są spełnione określone warunki.
Ponadto instrukcje wewnątrz strażnika muszą wyjść z zakresu. Dlatego mamy do sprawozdań kontrolnych program użytkownika return
, break
, continue
lub throw
na końcu zestawienia straży.
Składnia instrukcji Guard
guard expression else (// instrukcje // muszą zawierać instrukcję sterującą: return, break, continue lub throw.)
- Tutaj wyrażenie jest wyrażeniem boolowskim (zwraca albo
true
lubfalse
). - Jeśli wartość wyrażenia ma wartość
false
, wykonywane są instrukcje wewnątrz bloku koduguard
. - Jeśli wartość wyrażenia ma wartość
true
, instrukcje wewnątrz bloku koduguard
są pomijane podczas wykonywania.
Jak działa instrukcja strażnika?
Uwaga: Koniec rachunku Osłona musi zawierać oświadczenie sterowania return
, break
, continue
lub throw
.
Przykład 1: Jak działa instrukcja guard?
Proste prawidłowe oświadczenie strażnika jest następujące:
guard true else ( print("Condition not met") ) print("Condition met")
Po uruchomieniu programu wynik będzie następujący:
Warunek spełniony
W powyższym programie guard zawiera wartość logiczną true (warunek jest spełniony). Ponieważ instrukcje guard działają tylko wtedy, gdy warunek nie jest spełniony, instrukcja wewnątrz ochrony nie jest wykonywana. Dlatego print("Condition met")
jest wykonywany i wyświetla warunek spełniony na ekranie.
Teraz zmieńmy warunek na fałsz jako:
Przykład 2: instrukcja guard musi opuścić zakres
guard false else ( print("Condition not met") ) print("Condition met")
W powyższym programie warunek ochrony przyjmuje wartość false
. Zatem instrukcja print("Condition not met")
wewnątrz else powinna zostać wykonana. Ale pojawi się błąd mówiący , że ciało „strażnika” może nie spaść, rozważ użycie „powrotu” lub „rzutu” do wyjścia z lunety.
Komunikat o błędzie w prostych środków wyrazu, trzeba przekazać kontrolę programu z wykorzystaniem rachunku straży return
, break
, continue
lub throw
oświadczenia. Na razie będziemy używać return
. A ponieważ return
instrukcja może być używana tylko wewnątrz funkcji, powyższy kod będziemy opakowywać w Swift Functions.
Przykład 3: instrukcja guard wewnątrz funkcji
Możemy użyć instrukcji guard wewnątrz funkcji w języku Swift jako:
func someFunction() ( guard false else ( print("Condition not met") return ) print("Condition met") ) someFunction() print("Hello after function call")
Po uruchomieniu powyższego programu wynik będzie:
Warunek niespełniony Witaj po wywołaniu funkcji
W powyższym programie warunek wartownika ma wartość false
, dlatego wykonywane są instrukcje wewnątrz strażnika. Pierwsza instrukcja print("Condition not met")
wyświetla w konsoli warunek niespełniony .
Instrukcja return
kończy wykonywanie funkcji, a instrukcja print("Hello, after function call")
po wykonaniu wywołania funkcji, która wyświetla Hello po wywołaniu funkcji w konsoli.
Przykład 4: Osłona z opcjami
Widzieliśmy w Swift Optionals użycie if-let
do rozpakowania opcjonalnego. Możemy jednak również użyć instrukcji guard zamiast if-let
rozpakowywania opcjonalnego z jedną zaletą. Główną zaletą rozpakowywania opcjonalnej z ochroną zamiast z if-let
jest to, że możemy zwiększyć zakres rozpakowanej zmiennej.
Zobaczmy to na poniższym przykładzie:
func changeOptionalStringToUpperCase() ( var name:String? guard let temp = name else ( print("Name is nil. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Po uruchomieniu powyższego programu wynik będzie:
Imię jest zerowe. Nie można przetworzyć
W powyższym programie widać, że rozpakowana wartość temp jest używana poza zakresem zdefiniowanym przez instrukcję guard. Ponieważ nazwa jest zdefiniowana jako opcjonalna i zawiera wartość nil, instrukcja guard nie może rozpakować wartości.
Tak więc wykonywane są instrukcje wewnątrz guard else, które wypisują Name is nil. Nie można przetworzyć danych wyjściowych i kończy funkcję return
instrukcją. Odpowiedni kod powyższej instrukcji guard if-else to:
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()
Zauważ, że powyższe dwa stwierdzenia są ważne i działają tak samo. Jednak używając instrukcji if-let nie można używać rozpakowanej wartości poza instrukcją if-let. Ale za pomocą instrukcji guard możesz użyć nieopakowanej wartości w całej funkcji.
Przykład 5: Ochrona z wieloma warunkami
Instrukcje Guard mogą również łączyć wiele warunków oddzielonych przecinkiem (,) jako:
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()
Po uruchomieniu powyższego programu wynik będzie:
Nazwa to nil lub pusty ciąg. Nie można przetworzyć
W powyższym programie instrukcja guard zawiera dwa warunki oddzielone przecinkami.
Pierwszy warunek let temp = name
rozpina opcjonalny, który zwraca true
w naszym przypadku, a drugi warunek temp.count> 0
sprawdza, czy nieopakowany ciąg ma więcej niż 0 znaków, co false
w naszym przykładzie ma wartość.
W związku z tym instrukcja wewnątrz instrukcji guard wykonuje instrukcję, print("Name is nil or an empty string. Cannot process")
której wynikiem jest wartość nil lub pusty ciąg. Nie można przetworzyć w konsoli i kończy funkcję return
instrukcją.