Swift 2 Utgang tidlig med vakt

Overraske det deg at jeg dedikerer en opplæring til et enkelt tillegg som vakt uttalelse? Jeg håper du forstår bedre spenningen min på slutten av denne opplæringen. Under denne opplæringen håper jeg å overbevise deg om det vakt er alt annet enn et overflødig tillegg til Swift programmeringsspråket.

Minimerer kompleksitet

Conditionals er en grunnleggende komponent i hvert programmeringsspråk. Mål-C og Swift er ikke noe unntak fra denne regelen. Hvis du planlegger å skrive en applikasjon av noe kompleksitet, vil tilstandsbetingelser krysse veien, det er ingen escaping dem.

Dessverre er conditionals ofte den grunnen til kompleksitet. Nestede conditionals spesielt kan føre til vanskelig å finne feil, vanskelig å forstå kode, og lett oversett kasser.

Å holde nestet hvis uttalelser til et minimum bruker jeg ofte følgende mønster i Mål-C.

- (void) fetchListOfCustomers: (NSArray *) kunder hvis (! self.reachable) returnerer; hvis (! self.connected) returnere; hvis (! kunder ||! [kunder teller]) tilbake; ... 

Tanken er å kausjonere så snart som mulig. De hvis uttalelser i eksemplet representerer et sett med krav som må oppfylles før resten av metodens kropp utføres.

Ovennevnte eksempel oversettes til følgende litt mer komplekse ekvivalent.

- (void) fetchListOfCustomers: (NSArray *) kunder if (self.reachable && self.connected) if (kunder && [kunder teller]) ... 

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

Det er lett å oversette over mønsteret til Swift. Syntaxen ligner, men på grunn av kunder å være en valgfri, må vi pakke ut kunder argument før vi får tilgang til verdien.

func fetchListOfCustomers (kunder: [kunde]?) if! reachable return hvis! koblet return hvis la kunder = kunder hvor customers.count> 0 print (customers) 

Avslutter tidlig

Swift 2 introduserer vakt uttalelse. Den ble designet spesielt for å avslutte en metode eller funksjon tidlig. De vakt erklæringen er ideell for å kvitte seg med dypt nestede betingelser som har som eneste formål å validere et sett av krav. Ta en titt på det oppdaterte eksemplet som jeg har erstattet hver hvis uttalelse med det nye vakt uttalelse.

func fetchListOfCustomers (kunder: [kunde]?) vakt nås ellers retur vakt tilkoblet ellers return vakt la kunder = kunder hvor customers.count> 0 annet return print (customers) 

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

syntax

De vakt søkeord understreker at vi validerer et krav. Vi er vokter mot noe. I eksemplet sjekker vi eksplisitt om nås og tilkoblet er ekte. Hvis de ikke er det, avslutter vi metoden tidlig. Poenget er at syntaksen er mer eksplisitt om kravene enn en vanlig hvis uttalelse.

Exit

Legg merke til at a vakt erklæringen har alltid en ellers klausul. De ellers Klausulen utføres hvis tilstanden til vakt setningen evaluerer til falsk. Ved hjelp av vakt gjør mye mer fornuftig når du validerer krav.

I ellers klausul, må du overføre kontroll vekk fra omfanget der vakt setningen vises. Vi bruker en komme tilbake setning i eksempelet ovenfor, men du kan for eksempel bruke a Fortsetteerklæring om du er i en løkke eller kaster en feil. Ta en titt på det oppdaterte eksempelet nedenfor, der vi kaster en feil i ellers klausul. Legg merke til kaster søkeord i metodedeklarasjonen for å indikere det fetchListOfCustomers (_ :) er en kaste-metode.

funk fetchListOfCustomers (kunder: [Kunde]?) kaster vakt tilgjengelig annet kaster APIError.APIErrorUnreachable vakt tilkoblet annet kaster APIError.APIErrorNotConnected vakt la kunder = kunder hvor customers.count> 0 else throw APIError.APIErrorNoCustomers ... 

Kraftig

EN vakt erklæringen er like kraftig som en hvis uttalelse. Du kan bruke valgfrie bindinger og til og med bruken av hvor klausuler, introdusert i Swift 1.2, er tillatt. Jeg er sikker på at du er enig i at eksemplet er lett å forstå, og eliminerer unødvendige innlejrede tilstandsbetingelser.

omfang

En viktig forskjell med hvis uttalelser er omfanget av variabler og konstanter som tilordnes verdier ved hjelp av en valgfri binding. I eksempelet ovenfor er det kunder Konstant ble tildelt en verdi ved å bruke en valgfri binding. De kunder konstant er tilgjengelig fra omfanget av vakt uttalelse vises i. Dette er en viktig detalj og en av de viktigste fordelene ved å bruke vakt.

Konklusjon

Hvis du trodde det vakt var en enkel variasjon på Swift's hvis uttalelse, så håper jeg jeg har overbevist deg ellers. Samtidig som hvis uttalelser vil fortsatt være ditt valg i de fleste situasjoner, vakt har en rekke fordeler i visse situasjoner. Dette gjelder spesielt hvis det brukes i kombinasjon med feilhåndtering, som også ble introdusert i Swift 2.