Swift 2 ieșiți devreme cu garda

Te surprinde că eu dedicăm un tutorial unei simple adăugiri ca pază afirmație? Sper că veți înțelege mai bine entuziasmul meu la sfârșitul acestui tutorial. În timpul acestui tutorial, sper să vă conving pază este altceva decât o adăugare redundantă a limbajului de programare Swift.

Minimizarea complexității

Condițiile sunt o componentă fundamentală a fiecărui limbaj de programare. Obiectivul C și Swift nu fac excepție de la această regulă. Dacă intenționați să scrieți o aplicație a oricărei complexități, condiționările vor trece prin calea voastră, nu le scăpați.

Din păcate, condiționalitățile sunt adesea chiar cauza complexității. Condițiile înstrăinate, în special, pot duce la dificultăți de identificare a unor bug-uri, cod greu de înțeles și cazuri de margine ușor de neglijat.

Pentru a păstra imbricate dacă declarațiile la minim, folosesc frecvent următorul model în Obiectiv-C.

- (void) fetchListOfCustomers: (NSArray *) clienți if (! self.reachable) retur; dacă (! self.connected) reveniți; dacă ! clienții ||! [clienții numără] return); ... 

Ideea este de a salva cât mai curând posibil. dacă instrucțiunile din exemplu reprezintă un set de cerințe care trebuie îndeplinite înainte ca restul corpului metodei să fie executat.

Exemplul de mai sus se traduce în următorul echivalent ceva mai complex.

- (void) fetchListOfCustomers: (NSArray *) clienți if (self.reachable && self.connected) if (clienți && [clienți conta]) ... 

Vedeți problema care se ascunde în acest exemplu? Suntem deja imbogatiti cu doua nivele adanci fara a face nimic interesant.

Este ușor să traduceți modelul de mai sus la Swift. Sintaxa pare similar, dar datorită clienții fiind opțional, trebuie să despachetăm clienții argument înainte de a putea accesa valoarea sa.

func fetchListOfCustomers (clienți: [Customer]?) if! reachable return if! connected return dacă clienții = clienții unde customers.count> 0 print (customers) 

Pornind de la începutul anului

Swift 2 introduce modelul pază afirmație. Acesta a fost conceput special pentru a părăsi mai devreme o metodă sau o funcție. pază declarația este ideală pentru a scăpa de condiționări profund imbricate, al căror unic scop este validarea unui set de cerințe. Uitați-vă la exemplul actualizat în care am înlocuit fiecare dacă declarație cu noul pază afirmație.

func fetchListOfCustomers (clienți: [Client]?) pază accesibilă altceva return gardian conectat altceva return gardă permite clienților = clienți unde customers.count> 0 alt return print (clienți) 

Există mai multe lucruri demne de remarcat. Să începem cu sintaxa.

Sintaxă

pază cuvântul cheie subliniază faptul că validăm o cerință. Noi suntem păzit împotriva ceva. În exemplu, verificăm explicit dacă accesibil și conectat sunteți Adevărat. Dacă nu, atunci părăsim metoda mai devreme. Ideea este că sintaxa este mai explicită cu privire la cerințe decât o regulă dacă afirmație.

Ieșire

Rețineți că a pază declarația are întotdeauna un altfel clauză. altfel clauza este executată dacă condiția pază declarația se evaluează la fals. Utilizarea pază are sens mult mai mult când validați cerințele.

În altfel clauza, trebuie să transferați controlul departe de domeniul în care pază apare declarația. Noi folosim a întoarcere în exemplul de mai sus, dar ați putea, de exemplu, să utilizați a continuadeclarație dacă sunteți într-o buclă sau aruncați o eroare. Uitați-vă la exemplul actualizat de mai jos, în care aruncăm o eroare în altfel clauză. Rețineți aruncă cuvânt cheie în declarația metodei pentru a indica acest lucru fetchListOfCustomers (_ :) este o metodă de aruncare.

func fetchListOfCustomers (clienți: [Client]?) aruncă pază accesibilă altceva arunca APIError.APIErrorUnreachable gardian conectat altceva arunca APIError.APIErrorNotConnected păstrați clienți = clienți unde customers.count> 0 else throw APIError.APIErrorNoCustomers 

Puternic

A pază declarația este la fel de puternică ca o dacă afirmație. Puteți utiliza legăturile opționale și chiar utilizarea Unde clauzele introduse în Swift 1.2 sunt permise. Sunt sigur că sunteți de acord că exemplul este ușor de înțeles, eliminând condiționările inutile inutile.

domeniu

O diferență importantă cu dacă instrucțiunile reprezintă domeniul de aplicare al variabilelor și al constantelor care sunt atribuite valorilor utilizând o legare opțională. În exemplul de mai sus, clienții constanta a fost atribuită o valoare utilizând o legare opțională. clienții constantă este accesibilă din domeniul de aplicare pază declarația apare în. Acesta este un detaliu important și unul dintre avantajele cheie ale utilizării pază.

Concluzie

Dacă ați crezut asta pază a fost o variație simplă a lui Swift dacă declarație, atunci sper că v-am convins altfel. In timp ce dacă declarațiile vor continua să fie instrumentul dvs. de alegere în cele mai multe situații, pază are o serie de avantaje în anumite situații. Acest lucru este valabil mai ales dacă este utilizat în combinație cu manipularea erorilor, care a fost introdus și în Swift 2.

Cod