Swift From Scratch opțiuni și flux de control

Î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.

1. Opțional

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.

Ce este opțional?

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ă.

Forțarea dezvelirii

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.

Legarea opțională

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")

Ce este 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.

2. Controlul fluxului

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ță.

complet

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")

Cadea prin

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ă.

Modele de

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ă.

Legarea valorii

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 

Concluzie

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!

Cod