În articolele anterioare, ați învățat câteva dintre conceptele de bază ale limbajului de programare Swift. Dacă ați programat înainte, sunt sigur că ați văzut câteva asemănări cu alte limbi de programare, precum Ruby, JavaScript și Obiectiv-C.
În acest articol, mărim fluxul de control în Swift. Înainte de a putea discuta despre fluxul de control în detaliu, trebuie să aruncăm o privire la un concept care este nou pentru majoritatea dintre voi, opțional. Opțiunile sunt o altă caracteristică de siguranță a lui Swift. La început, ar putea părea ca un hassle pentru a utiliza opțional, dar veți afla rapid că opțiunile vor face codul mult mai sigur.
Am văzut deja că o variabilă trebuie inițializată înainte ca aceasta să poată fi utilizată. Uitați-vă la următorul exemplu pentru a înțelege mai bine ce înseamnă acest lucru.
var str: String str.isEmpty
Dacă sunteți obișnuit să lucrați cu șiruri de caractere în Obiectiv-C, atunci s-ar putea să fiți surprinși de faptul că Swift vă arată o eroare. Să vedem ce ne spune această eroare.
În multe limbi, variabilele au o valoare implicită inițială. În Obiectiv-C, de exemplu, șirul din următorul fragment de cod este egal cu zero
.
NSString * newString;
Cu toate acestea, conceptul de zero
diferă în Swift și Obiectiv-C. Vom discuta zero
în detaliu un pic mai târziu.
Swift folosește opțiunile pentru a încapsula un concept important, adică o variabilă sau o constantă are o valoare sau nu. Este atât de simplu în Swift. Pentru a declara o variabilă sau o constantă ca opțională, adăugăm un semn de întrebare tipului variabilei sau constantei.
var str: String?
Variabila str
nu mai este de tip Şir
. Acum este de tip facultativ Şir
. Acest lucru este important de înțeles. Rezultatul sau efectul secundar este că nu mai putem interacționa direct cu valoarea lui str
variabil. Valoarea este stocată în siguranță în opțional și trebuie să solicităm opțional valoarea pe care o încapsulează.
O modalitate de a accesa valoarea unui opțional este prin retragerea forțată. Putem accesa valoarea variabilei str
prin adăugarea unui !
la numele variabilei.
var str: String? str = "Test" print (str!)
Este important să fii sigur că opțiunea conține o valoare când o forțezi să o despachetezi. Dacă opțiunea nu are o valoare și o forțezi să o desfaci, Swift va arunca o eroare la tine.
Există o modalitate mai sigură de a accesa valoarea unui opțional. Vom analiza mai atent dacă
în câteva minute, dar următorul exemplu arată cum putem accesa în siguranță valoarea stocată în variabilă str
, care este de tip opțional Şir
.
var str: String? dacă str! = nil print (str!) altceva print ("str nu are valoare")
Mai întâi verificăm dacă variabila str
este egal cu zero
înainte de a imprima conținutul. În acest exemplu, str
nu are o valoare, ceea ce înseamnă că nu va fi forțat dezbrăcat accidental.
Există o abordare mai elegantă numită legare opțională. În exemplul următor, atribuim valoarea stocată în opțional unei constante temporare, care este utilizată în dacă
afirmație. Valoarea opțiunii str
este legat de constanta strConst
și utilizate în dacă
afirmație. Această abordare funcționează și pentru in timp ce
declaraţii.
var str: String? str = "Test" dacă strConst = str print (strConst) altceva print ("str nu are valoare")
zero
?Dacă veniți din obiectivul C, atunci cu siguranță știi ce zero
este. În Obiectiv-C, zero
este un pointer la un obiect care nu există. Swift definește zero
un pic diferit, și este important să înțelegeți diferența.
În Swift, zero
înseamnă absența unei valori, a oricărei valori. In timp ce zero
se aplică numai obiectelor din Obiectiv-C, în Swift zero
poate fi folosit pentru orice tip. Prin urmare, este important să înțelegeți că un opțional nu este echivalentul lui zero
în obiectivul C. Aceste concepte sunt foarte diferite.
Swift oferă o serie de construcții comune pentru a controla fluxul codului pe care îl scrieți. Dacă aveți o programare cu experiență, atunci nu veți avea probleme de a vă ridica la viteză cu construcțiile de control Swift, condiționate dacă
și intrerupator
declarații și pentru
și in timp ce
bucle.
Cu toate acestea, Swift nu ar fi Swift dacă fluxul de control nu diferă ușor față de construcțiile de control ale obiectivului C, de exemplu. În timp ce detaliile sunt importante, sunt sigur că nu vă vor împiedica să vă ridicați viteza cu Swift. Să începem cu cea mai comună construcție condiționată, dacă
afirmație.
dacă
lui Swift dacă
afirmațiile sunt foarte asemănătoare cu cele găsite în Obiectivul C. Principala diferență este că nu este nevoie să înfășurați condiția în paranteze. Totuși, coastele curbate sunt obligatorii. Acesta din urmă împiedică dezvoltatorii să introducă bug-uri comune care sunt legate de scriere dacă
declarații fără acolade. Asta e ceea ce dacă
declarația arată ca în Swift.
Fie a = 10 dacă a> 10 print ("Valoarea \" a \ "este mai mare de 10.") altceva print ("Valoarea \" a \ "este mai mică sau egală cu 10." )
Ar trebui să nu fie o surpriză faptul că Swift definește și o altfel
clauză. Codul din altfel
clauza este executată dacă condiția este egală cu fals
. Este, de asemenea, posibil să se lanseze dacă
astfel cum se arată în exemplul următor.
Fie a = 10 dacă a> 10 print ("Valoarea \" a \ "este mai mare de 10.") altceva dacă o> 5 print ("Valoarea \" a \ "este mai mare de 5. ") else print (" Valoarea \ "a \" este mai mică sau egală cu 5. ")
Există o notă importantă de făcut, adică starea unui dacă
declarația trebuie să se întoarcă Adevărat
sau fals
. Acest lucru nu este valabil pentru dacă
declarații în Obiectiv-C. Uitați-vă la următoarele dacă
declarație în Obiectiv-C.
NSArray * array = @ []; if (array.count) NSLog (@ "Matricea conține unul sau mai multe elemente."); altceva NSLog (@ "Matricea este goală.");
Dacă am transfera fragmentul de cod de mai sus la Swift, am întâmpina o eroare. Eroarea nu este foarte informativă, dar Swift ne spune că trebuie să asigurăm rezultatul evaluării condiției Adevărat
sau fals
.
Modul corect de a traduce fragmentul Objective-C de mai sus la Swift este prin asigurarea condiției dacă
declarația se evaluează la Adevărat
sau fals
, ca în fragmentul următor.
array = [String] () dacă array.count> 0 print ("Matricea conține unul sau mai multe elemente.") else print ("Matricea este goală"
intrerupator
lui Swift intrerupator
declarația este mai puternică decât echivalentul său obiectiv-C. Este, de asemenea, mai sigur, așa cum veți învăța într-un moment. În timp ce există unele diferențe, intrerupator
afirmațiile din Swift respectă același concept ca și cele din alte limbi de programare; o valoare este trecută la intrerupator
declarație, și este comparat cu posibile modele de potrivire.
Corect, tipare. Așa cum am spus, a intrerupator
declarația de la Swift are câteva trucuri în mânecă. Vom arunca o privire la aceste trucuri într-un moment. Să vorbim mai întâi despre siguranță.
A intrerupator
afirmația din Swift trebuie să fie exhaustivă, ceea ce înseamnă că orice valoare posibilă a tipului care i se transmite intrerupator
declarația trebuie să fie tratată de către intrerupator
afirmație. Ca și în Obiectiv-C, acest lucru este ușor de rezolvat prin adăugarea a Mod implicit
, după cum se arată în exemplul următor.
(a este egal cu 0) caz 1: imprimare ("a este egal cu 1") implicit: print ("a are altă valoare")
O diferență importantă față de punerea în aplicare a obiectivului C intrerupator
afirmațiile este lipsa unei căderi implicite. Următorul exemplu nu funcționează în Swift din câteva motive.
a = 10 comută un caz 0: cazul 1: tipăriți ("a este egal cu 1") implicit: print ("a are altă valoare")
Primul caz în care A
este comparat 0
nu se implică implicit în al doilea caz în care A
este comparat 1
. Dacă adăugați exemplul de mai sus la locul de joacă, veți observa că Swift aruncă o eroare la dvs. Eroarea spune că fiecare caz trebuie să includă cel puțin o declarație executabilă.
Observați că cazurile de intrerupator
declarația nu include pauză
declarații pentru a ieși din intrerupator
afirmație. Acest lucru nu este necesar în Swift, deoarece scaderea implicită nu există în Swift. Acest lucru va elimina o serie de bug-uri comune cauzate de căderea neintenționată.
Puterea a intrerupator
declarația din Swift constă în potrivirea modelului. Aruncati o privire la urmatorul exemplu in care am folosit intervale pentru a compara valoarea considerata impotriva.
lăsați a = 10 comuta un caz 0 ... <5: print("The value of a lies between 0 and 4.") case 5… 10: print("The value of a lies between 5 and 10.") default: print("The value of a is greater than 10.")
... <
operatorul sau operatorul de interval semi-deschis definește un interval de la prima valoare la a doua valoare, excluzând a doua valoare. ...
operatorul sau operatorul de interval închis definește un interval de la prima valoare la a doua valoare, inclusiv a doua valoare. Acești operatori sunt foarte utili într-o gamă largă de situații.
De asemenea, puteți compara valoarea considerată a intrerupator
declarație la tuple. Uitați-vă la următorul exemplu pentru a vedea cum funcționează acest lucru.
lăsați latlng = (34.15, -78.03) comută latlng case (0, 0): print ("Suntem în centrul planetei") case (0 ... 90, _) emisiunea nordică ") (-90 ... 0, _): print (" Suntem în emisfera sudică ") implicit: print (" Coordonata este nevalidă ")
După cum puteți vedea în exemplul de mai sus, este posibil ca valoarea să corespundă mai multor cazuri. Când se întâmplă acest lucru, se alege primul caz de potrivire. Exemplul de mai sus ilustrează, de asemenea, utilizarea sublinierii. După cum am văzut în articolul precedent, putem folosi o subliniere, _
, să-i spunem lui Swift ce valori nu ne interesează.
De asemenea, este posibilă legarea valorii intrerupator
declarații, așa cum demonstrează exemplul de mai jos. A doua valoare a tuplei este temporar legată de constanta Descriere
pentru utilizare în primul și al doilea caz.
var răspuns = (200, "OK") comutare răspuns caz (200 ... <400, let description): print("The request was successful with description \(description).") case (400… <500, let description): print("The request was unsuccessful with description \(description).") default: print("The request was unsuccessful with no description.")
pentru
pentru
buclă este primul construct buclă vom arunca o privire la. Se comportă foarte asemănător cu pentru
în alte limbi. Au existat două arome, pentru
și buclă pentru-in
buclă. Însă din Swift 3, stilul C pentru
buclele nu mai sunt disponibile. Următorul fragment nu este posibil în Swift 3.
pentru var i = 0; eu < 10; i++ print("i is equal to \(i).")
Dacă inserați acest fragment într - un loc de joacă, veți observa și faptul că ++
și --
operatorii nu mai sunt disponibili în Swift 3.
pentru-in
buclă este ideal pentru looping peste conținutul unei game sau colecție. În exemplul următor, ne confruntăm cu elementele unei matrice.
permiteți numerelor = [1, 2, 3, 5, 8] pentru numărul în numere print ("numărul este egal cu \ (număr)"
Putem de asemenea folosi pentru-in
buclele de buclă peste perechile cheie-valoare ale unui dicționar. În exemplul următor, declarăm un dicționar și tipărim conținutul acestuia în consolă. După cum am văzut mai devreme în această serie, secvența perechilor cheie-valoare este nedefinită deoarece un dicționar este un set neordonat de perechi cheie-valoare.
var ofertele = ["Tom": 100, "Bart": 150, "Susan": 120] pentru (nume, ofertă)
Fiecare pereche cheie-valoare a dicționarului este disponibilă în pentru-in
buclă ca o tuplă de constante numite. pentru-in
buclă este, de asemenea, mare, în combinație cu intervale. Sunt sigur că sunteți de acord că fragmentul de mai jos este ușor de citit și de înțeles datorită utilizării unei game închise.
pentru i în 1 ... 10 print ("i este egal cu \ (i)")
in timp ce
in timp ce
buclă vine în două arome, in timp ce
și repeta-in timp ce
. Principala diferență este că setul de afirmații ale unui a repeta-in timp ce
buclă este întotdeauna executată cel puțin o dată, deoarece starea repeta-in timp ce
este evaluată la sfârșitul fiecărei iterații. Următorul exemplu ilustrează această diferență.
var c = 5 var d = 5 în timp ce c < d print("c is smaller than d") repeat print("c is smaller than d") while c < d
Declarația de imprimare a in timp ce
bucla nu este niciodată executată, în timp ce cea a repeta-in timp ce
buclă este executată o singură dată.
În multe cazuri, pentru
buclele pot fi rescrise ca in timp ce
buclele și adesea depinde de dezvoltator pentru a determina ce tip de buclă să o utilizeze într-o anumită situație. Următoarele pentru
și in timp ce
buclele au aceeași ieșire.
pentru i în 0 ... <10 print(i) var i = 0 while i < 10 print(i) i += 1
Există mult mai mult pentru a controla fluxul în Swift decât ceea ce am acoperit în acest articol, dar acum aveți o înțelegere de bază pentru a continua călătoria dvs. în Swift. Sper că acest tutorial ți-a arătat cum implementarea fluxului de control al Swift este foarte asemănătoare cu cea a altor limbi de programare, dar cu o răsucire.
În restul seriei vom folosi mai mult construcțiile de control Swift și veți obține o înțelegere mai bună a diferențelor subtile dintre Swift și limbi precum Obiectiv-C. În următoarea tranșă a acestei serii, vom începe să explorăm funcții.
Dacă doriți o cale rapidă de a începe să construiți aplicații cu limba Swift, avem un curs pentru asta!
Sau verificați câteva dintre celelalte tutoriale și cursuri de curs despre dezvoltarea Swift și iOS!