Swift 2 Exit Early With guard

Verbaast het je dat ik een tutorial opdraag aan een eenvoudige toevoeging als de bewaker uitspraak? Ik hoop dat je mijn opwinding aan het einde van deze tutorial beter zult begrijpen. Tijdens deze tutorial hoop ik je te overtuigen bewaker is allesbehalve een overbodige toevoeging aan de programmeertaal van Swift.

Complexiteit minimaliseren

Voorwaardelijke bepalingen vormen een fundamenteel onderdeel van elke programmeertaal. Objective-C en Swift vormen geen uitzondering op deze regel. Als u van plan bent om een ​​toepassing van een complexiteit te schrijven, zullen conditionals uw pad kruisen, er is geen ontkomen aan.

Helaas zijn conditionals vaak de oorzaak van complexiteit. Met name geneste conditionals kunnen leiden tot moeilijk te vinden bugs, moeilijk te begrijpen code en gemakkelijk over het hoofd gezien randgevallen.

Om genest te blijven als uitspraken tot een minimum beperken, ik gebruik vaak het volgende patroon in Objective-C.

- (ongeldig) fetchListOfCustomers: (NSArray *) klanten if (! self.reachable) return; als (! self.connected) terugkomt; als (! klanten ||! [klanten tellen]) terugkeren; ... 

Het idee is om zo snel mogelijk te redden. De als statements in het voorbeeld vertegenwoordigen een reeks vereisten waaraan moet worden voldaan voordat de rest van de body van de methode wordt uitgevoerd.

Het bovenstaande voorbeeld vertaalt zich naar het volgende iets complexere equivalent.

- (void) fetchListOfCustomers: (NSArray *) klanten if (self.reachable && self.connected) if (klanten && klanten tellen mee)) ... 

Zie je het probleem op de loer in dit voorbeeld? We zijn al twee niveaus diep genest zonder iets interessants te hebben gedaan.

Het is eenvoudig om het bovenstaande patroon naar Swift te vertalen. De syntaxis lijkt vergelijkbaar, maar vanwege klanten als een optie is, moeten we het klanten argument voordat we toegang hebben tot de waarde ervan.

func fetchListOfCustomers (klanten: [klant]?) if! bereikbaar retour indien! connected return indien klanten = klanten waarbij klanten.count> 0 print (klanten) 

Vroeg afsluiten

Swift 2 introduceert de bewaker uitspraak. Het is specifiek ontworpen om vervroegd een methode of functie te verlaten. De bewaker verklaring is ideaal voor het wegwerken van diep geneste voorwaardes waarvan het enige doel is om een ​​reeks vereisten te valideren. Bekijk het bijgewerkte voorbeeld waarin ik elk heb vervangen als verklaring met het nieuwe bewaker uitspraak.

func fetchListOfCustomers (klanten: [klant]?) bewaker bereikbaar elders retour bewaker aangesloten anders retour bewaker laat klanten = klanten waar klanten.count> 0 else retour afdrukken (klanten) 

Er zijn verschillende dingen die het vermelden waard zijn. Laten we beginnen met de syntaxis.

Syntaxis

De bewaker keyword benadrukt dat we een vereiste valideren. Wij zijn bewaken tegen iets. In het voorbeeld controleren we expliciet of bereikbaar en verbonden zijn waar. Als dat niet het geval is, verlaten we de methode vroegtijdig. Het punt is dat de syntaxis meer expliciet is over de vereisten dan een reguliere als uitspraak.

Uitgang

Merk op dat a bewaker statement heeft altijd een anders clausule. De anders clausule wordt uitgevoerd als de voorwaarde van de bewaker statement evalueert naar vals. Gebruik makend van bewaker is veel logischer als u eisen valideert.

In de anders clausule, moet u de controle overdragen van de scope waarin de bewaker verklaring verschijnt. We gebruiken een terugkeer verklaring in het bovenstaande voorbeeld, maar u kunt bijvoorbeeld een a gebruiken doorgaan metAls u zich in een lus bevindt of een foutmelding krijgt. Bekijk het bijgewerkte voorbeeld hieronder waarin we een fout in de anders clausule. Merk op worpen sleutelwoord in de methodeverklaring om dat aan te geven fetchListOfCustomers (_ :) is een werpmethode.

func fetchListOfCustomers (klanten: [Klant]?) gooit bewaker bereikbaar] throw APIError.APIErrorUnreachable bewaker anders verbonden throw APIError.APIErrorNotConnected bewaker laat klanten = klanten waar customers.count> 0 else throw APIError.APIErrorNoCustomers ... 

krachtig

EEN bewaker verklaring is net zo krachtig als een als uitspraak. U kunt optionele bindingen gebruiken en zelfs het gebruik van waar clausules, geïntroduceerd in Swift 1.2, is toegestaan. Ik ben er zeker van dat u het ermee eens bent dat het voorbeeld gemakkelijk te begrijpen is en onnodige geneste conditionals overbodig zijn.

strekking

Een belangrijk verschil met als statements is het bereik van variabelen en constanten waaraan waarden zijn toegewezen met behulp van een optionele binding. In het bovenstaande voorbeeld, de klanten constante kreeg een waarde toegewezen met behulp van een optionele binding. De klanten constante is toegankelijk vanuit de scope de bewaker verklaring verschijnt in. Dit is een belangrijk detail en een van de belangrijkste voordelen van het gebruik bewaker.

Conclusie

Als je dat dacht bewaker was een simpele variatie op Swift's als verklaring, dan hoop ik dat ik je anders heb overtuigd. Terwijl als Verklaringen blijven in de meeste situaties uw favoriete hulpmiddel, bewaker heeft in bepaalde situaties een aantal voordelen. Dit geldt vooral als het wordt gebruikt in combinatie met foutafhandeling, die ook in Swift 2 is geïntroduceerd.