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.
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)
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.
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.
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 Fortsette
erklæ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 ...
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.
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
.
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.