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.
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)
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.
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.
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 met
Als 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 ...
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.
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
.
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.