Swift 2.0: Exit Tidlig Med guard

Swift 2.0: Exit Tidlig Med vakt
20
Del
to
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

Overrasker det deg at jeg dedikere en tutorial til et enkelt tillegg som vakt uttalelsen? Jeg håper du vil bedre forstå min begeistring på slutten av denne opplæringen. I løpet av denne opplæringen, jeg håper å overbevise deg om at vakt er alt annet enn en redundant tillegg til Swift programmeringsspråk.

Minimizing Kompleksitet

Conditionals er en fundamental komponent i hvert programmeringsspråk. Objective-C og Swift er ikke noe unntak fra denne regelen. Hvis du har tenkt å skrive en søknad av kompleksitet, vil conditionals krysse din vei, er det ingen unnslippe dem.

Dessverre, conditionals er ofte selve årsaken til kompleksitet. Nestet conditionals i bestemte kan føre til vanskelig å finne feil, vanskelig å forstå koden, og lett oversett edge tilfeller.

For å holde nestet hvis uttalelser til et minimum, jeg bruker ofte følgende mønster i Objective-C. < (! self.reachable): - br> (void) fetchListOfCustomers (NSArray *) kunder {if tilbake; if (self.connected!) tilbake; hvis retur (kunder || [kunder teller]!); ...}

Ideen er å kausjon ut så snart som mulig. IF uttalelser i eksempelet representerer et sett med krav som må være oppfylt før resten av metodens kroppen utføres

Eksemplet ovenfor betyr følgende litt mer komplisert tilsvarAnmeldelser -.. (Void ) fetchListOfCustomers: (NSArray *) kunder {if (self.reachable & & self.connected) {if (kunder & & [kunder telle]) {...}}}

Ser du problemet lurking i dette eksempelet? Vi er allerede nestet to nivåer dypt uten å ha gjort noe interessant.

Det er lett å oversette ovennevnte mønsteret til Swift. Syntaksen ligner, men på grunn av kundene å være en valgfri, må vi pakke opp kunder argument før vi kan få tilgang til sin verdi
funk fetchListOfCustomers. (Kunder:? [Kunde]) {if nås {return} hvis tilkoblet! {return} hvis la kundene = kunder hvor customers.count > 0 {print (kundene)}}
Avslutter Tidlig

Swift 2 introduserer vakt uttalelse. Det er designet spesielt for å avslutte en metode eller funksjon tidlig. Vakten uttalelsen er ideell for å bli kvitt dypt nestede conditionals hvis eneste formål er å validere et sett med krav. Ta en titt på den oppdaterte eksempel der jeg har erstattet hver hvis setningen med den nye vakt uttalelse
funk fetchListOfCustomers. (Kunder:? [Kunden]) {vokte nås else {retur} vakt koblet else {retur} vakt utleid kunder = kunder hvor customers.count > 0 annet {return} print (kunder)}

Det er flere ting som er verdt å merke seg. La oss starte med syntaksen.

Syntax

Vakten søkeord understreker at vi er å validere et krav. Vi er vokter
mot noe. I eksemplet vi eksplisitt sjekke om tilgjengelig og tilkoblet er sanne. Hvis de ikke er det, så vi avslutter metoden tidlig. Poenget er at syntaksen er mer eksplisitt om de krav enn en vanlig hvis setningen.

Exit

Merk at en vakt uttalelse har alltid et annet klausul. Den andre klausulen er utført dersom betingelsen av vakt uttalelsen evalueres til false. Bruke vakt gjør mye mer fornuftig når du validere krav.

I annet ledd, må du overføre kontrollen bort fra omfanget der vakten uttalelsen vises. Vi bruker en retur uttalelse i eksempelet ovenfor, men du kan for eksempel bruke en continuestatement hvis du er i en sløyfe eller kaste en feil. Ta en titt på den oppdaterte eksempelet nedenfor der kaster vi en feil i et annet klausul. Legg merke til den kaster nøkkelordet i metoden erklæring for å indikere at fetchListOfCustomers (_ :) er en kaste metode
funk fetchListOfCustomers (kunder:.? [Kunden]) kaster {vokte nås else {kaste APIError.APIErrorUnreachable} vakt koblet else {throw APIError.APIErrorNotConnected} vakt la kunder = kunder hvor customers.count > 0 else {kaste APIError.APIErrorNoCustomers} ...}
Kraftig

En vakt uttalelse er like kraftig som en hvis setningen. Du kan bruke valgfrie bindinger og selv bruk av hvor klausuler, som ble introdusert i Swift 1.2, er tillatt. Jeg er sikker på at du enig i at eksempelet er lett å forstå, eliminerer unødvendige nestet conditionals.

Scope

En viktig forskjell hvis uttalelser er omfanget av variabler og konstanter som er tildelt verdier ved hjelp en valgfri binding. I eksempelet ovenfor, ble kundene konstant tildelt en verdi ved hjelp av en valgfri binding. Kundene konstant er tilgjengelig fra omfanget vakten uttalelsen vises i. Dette er en viktig detalj, og en av de viktigste fordelene ved å bruke vakt.

Konklusjon

Hvis du trodde at vakten var en enkel variant av Swifts hvis setningen, så jeg håper jeg har overbevist deg noe annet. Mens hvis uttalelser vil fortsette å være verktøyet av valget i de fleste situasjoner, har vakt en rekke fordeler i visse situasjoner. Dette gjelder spesielt hvis det brukes i kombinasjon med feilhåndtering, som også ble innført i Swift 2.