În acest articol, veți învăța să utilizați declarația de gardă pentru a controla fluxul de execuție al programului.
Instrucțiunea Swift If descrie cum puteți efectua acțiuni bazate pe anumite condiții (valoare booleană). În acest articol, vom explora avantajele declarației de gardă asupra instrucțiunii dacă controlează fluxul programului și scriem un cod mai simplu și mai curat.
Declarație de gardă rapidă
Principala utilizare a declarației de gardă este de a transfera controlul programului în afara unui domeniu în anumite condiții. Aceste instrucțiuni sunt similare cu instrucțiunile if care execută instrucțiuni bazate pe anumite condiții (valoare booleană), dar spre deosebire de cazul în care, instrucțiunile de gardă rulează numai atunci când anumite condiții nu sunt îndeplinite.
Mai mult, declarațiile din interiorul pazei trebuie să iasă din scop. Prin urmare, trebuie să declarații de control al programului de utilizator return
, break
, continue
sau throw
la finalul declarației de paza.
Sintaxa declarației de gardă
expresie de gardă else (// declarații // trebuie să conțină o declarație de control: return, break, continue or throw.)
- Aici, expresia este o expresie booleană (returnează fie
true
saufalse
). - Dacă expresia este evaluată la
false
,guard
se execută instrucțiunile din blocul de cod al . - Dacă expresia este evaluată la
true
, instrucțiunile din blocul de cod dinguard
sunt omise de la executare.
Cum funcționează declarația de gardă?
Notă: Sfârșitul declarației de protecție trebuie să conțină o declarație de control return
, break
, continue
sau throw
.
Exemplul 1: Cum funcționează declarația de pază?
O declarație validă simplă de pază este următoarea:
guard true else ( print("Condition not met") ) print("Condition met")
Când rulați programul, ieșirea va fi:
Condiția îndeplinită
În programul de mai sus, guard conține o valoare booleană true (condiția este îndeplinită). Deoarece declarațiile de gardă rulează numai atunci când condiția nu este îndeplinită, declarația din cadrul pazei nu este executată. De aceea print("Condition met")
este executată și ieșirile Condiția îndeplinite pe ecran.
Acum să schimbăm condiția în fals ca:
Exemplul 2: declarația de gardă trebuie să părăsească domeniul de aplicare
guard false else ( print("Condition not met") ) print("Condition met")
În programul de mai sus, starea de gardă se evaluează la false
. Deci, declarația print("Condition not met")
din altceva ar trebui să se execute. Dar veți primi o eroare spunând că corpul „paznic” poate să nu cadă, luați în considerare utilizarea unei „întoarceri” sau „aruncări” pentru a ieși din scop.
Mesajul de eroare în cuvântul înseamnă simplu, trebuie să transferați programul de control din declarația de protecție folosind return
, break
, continue
sau throw
declarații. Deocamdată vom folosi return
. Și întrucât return
instrucțiunea poate fi utilizată numai în interiorul unei funcții, vom înfășura mai sus codul în funcțiile Swift.
Exemplul 3: instrucțiunea guard în interiorul unei funcții
Putem folosi declarația de gardă dintr-o funcție din Swift ca:
func someFunction() ( guard false else ( print("Condition not met") return ) print("Condition met") ) someFunction() print("Hello after function call")
Când rulați programul de mai sus, ieșirea va fi:
Condiția nu este îndeplinită Bună ziua după apelul funcțional
În programul de mai sus, starea de pază se evaluează false
, deci declarațiile din interiorul pazei se execută. Primele instrucțiuni de print("Condition not met")
ieșire Condiția nu a fost îndeplinită în consolă.
Și instrucțiunea return
pune capăt execuției unei funcții, iar instrucțiunea print("Hello, after function call")
după apelul funcției execută ce ieșiri Hello după apel funcție în consolă.
Exemplul 4: Gardă cu opțional
Am văzut în Swift Optionals utilizarea if-let
pentru a desface un opțional. Cu toate acestea, putem folosi, de asemenea, declarația de gardă în locul if-let
despachetării unui opțional cu un singur avantaj. Principalul avantaj al desfacerii unei opționale cu protecție în loc de if-let
este că putem crește domeniul de aplicare al variabilei despachetate.
Să vedem acest lucru în exemplul de mai jos:
func changeOptionalStringToUpperCase() ( var name:String? guard let temp = name else ( print("Name is nil. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase()
Când rulați programul de mai sus, ieșirea va fi:
Numele este nul. Nu se poate procesa
În programul de mai sus, puteți vedea că valoarea neambalată a temperaturii este utilizată în afara domeniului definit de instrucțiunea guard. Deoarece, numele este definit opțional și conține valoare nulă, instrucțiunea de protecție nu reușește să desfacă valoarea.
Deci, declarațiile din gardian execută altceva care imprimă numele este nul. Nu se poate procesa în ieșire și termină funcția cu return
instrucțiune. Codul echivalent al declarației de gardă de mai sus declarația if-else este:
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()
Notă de mai sus, două afirmații sunt valabile și fac aceeași treabă. Dar folosind instrucțiunea if-let nu puteți utiliza valoarea despachetată în afara instrucțiunii if-let. Dar cu declarația de gardă puteți utiliza valoarea desfăcută prin funcție.
Exemplul 5: Pază cu condiții multiple
Declarațiile de gardă pot, de asemenea, să lanseze mai multe condiții separate prin virgulă (,) ca:
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()
Când rulați programul de mai sus, ieșirea va fi:
Numele este nul sau un șir gol. Nu se poate procesa
În programul de mai sus, declarația de gardă conține două condiții separate prin virgulă.
Prima condiție let temp = name
dezvăluie o opțională care revine true
în cazul nostru, iar a doua condiție temp.count> 0
verifică dacă șirul despachetat are mai mult de 0 caractere, ceea ce este evaluat false
în exemplul nostru.
Prin urmare, instrucțiunea din instrucțiunea guard execută instrucțiunea print("Name is nil or an empty string. Cannot process")
care scoate numele este nul sau un șir gol. Nu se poate procesa în consolă și termină funcția cu return
instrucțiune.