Swift 2 Avsluta tidigt med vakten

Förundrar det dig att jag ägnar en handledning till ett enkelt tillägg som vakt påstående? Jag hoppas att du bättre förstår min spänning i slutet av denna handledning. Under denna handledning hoppas jag övertyga dig om det vakt är allt annat än ett överflödigt tillägg till Swift programmeringsspråket.

Minimera komplexiteten

Conditionals är en grundläggande komponent i varje programmeringsspråk. Mål-C och Swift är inget undantag från denna regel. Om du planerar att skriva en ansökan av någon komplexitet, kommer conditionals att korsa din väg, det finns ingen utrymning för dem.

Tyvärr är conditionals ofta den främsta orsaken till komplexitet. Nästillgängliga villkor kan i synnerhet leda till svårt att hitta buggar, svårt att förstå kod och lätt överskådda kantfall.

För att hålla sig nestad om uttalanden till ett minimum använder jag ofta följande mönster i mål-C.

- (void) fetchListOfCustomers: (NSArray *) kunder om (! self.reachable) returnerar; om (! self.connected) returnera; om (! kunder ||! [kunder räknar]) returnera; ... 

Tanken är att baila ut så snart som möjligt. De om uttalanden i exemplet representerar en uppsättning krav som måste uppfyllas innan resten av metodens kropp utförs.

Ovanstående exempel översätts till följande något mer komplexa ekvivalent.

- (tomt) 

Ser du problemet lurar i det här exemplet? Vi är redan nestade två nivåer djupt utan att ha gjort något intressant.

Det är lätt att översätta ovanstående mönster till Swift. Syntaxen liknar, men på grund av kunder att vara valfri, vi behöver paketera kunder argument innan vi får tillgång till dess värde.

func fetchListOfCustomers (kunder: [kund]?) if! reachable return if! connected return om låt kunder = kunder där customers.count> 0 print (customers) 

Avsluta tidigt

Swift 2 introducerar vakt påstående. Det var utformat speciellt för att avsluta en metod eller funktion tidigt. De vakt uttalandet är idealiskt för att bli av med djupt inhäftade villkor, vars enda syfte är att validera en uppsättning krav. Ta en titt på det uppdaterade exemplet som jag har bytt ut varje om uttalande med det nya vakt påstående.

func fetchListOfCustomers (kunder: [Kund]?) skydd nås annars return guard connected otherwise return guard låta kunder = kunder där customers.count> 0 else return print (customers) 

Det finns flera saker som är värda att notera. Låt oss börja med syntaxen.

Syntax

De vakt nyckelord betonar att vi validerar ett krav. Vi är bevakning mot något. I exemplet kontrollerar vi explicit om nåbar och ansluten är Sann. Om de inte är så avslutar vi metoden tidigt. Poängen är att syntaxen är mer tydlig om kraven än en vanlig om påstående.

Utgång

Observera att a vakt uttalandet har alltid en annan klausul. De annan klausulen utförs om villkoret för vakt uttalandet utvärderas till falsk. Använder sig av vakt ger mycket större mening när du validerar krav.

I annan klausul måste du överföra kontrollen bort från det område där vakt uttalandet visas. Vi använder en lämna tillbaka uttalande i ovanstående exempel, men du kan till exempel använda a Fortsättauttalande om du är i en loop eller kasta ett fel. Ta en titt på det uppdaterade exemplet nedan, där vi slänger ett fel i annan klausul. Notera kastar sökord i metoddeklarationen för att ange det fetchListOfCustomers (_ :) är en kasta metod.

func fetchListOfCustomers (kunder: [Kunden]?) kasta skydda tillvägagångssätt annars kasta APIError.APIErrorUnreachable skydda ansluten annars kasta APIError.APIErrorNotConnected bevaka låt kunder = kunder där customers.count> 0 else throw APIError.APIErrorNoCustomers ... 

Kraftfull

en vakt uttalandet är lika kraftfullt som en om påstående. Du kan använda valfria bindningar och till och med användningen av var klausuler som införs i Swift 1.2 är tillåtna. Jag är säker på att du håller med om att exemplet är lätt att förstå, vilket eliminerar onödiga kapslade villkor.

Omfattning

En viktig skillnad med om uttalanden är omfattningen av variabler och konstanter som tilldelas värden med en valfri bindning. I ovanstående exempel kunder konstant tilldelades ett värde med en valfri bindning. De kunder konstant är tillgänglig från räckvidden vakt uttalandet visas i. Detta är en viktig detalj och en av de viktigaste fördelarna med att använda vakt.

Slutsats

Om du trodde det vakt var en enkel variant på Swift's om uttalande, då hoppas jag att jag har övertygat dig annars. Medan om uttalanden kommer att fortsätta att vara ditt val i de flesta situationer, vakt har vissa fördelar i vissa situationer. Detta gäller särskilt om det används i kombination med felhantering, som också infördes i Swift 2.