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.
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)
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.
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.
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ätta
uttalande 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 ...
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.
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
.
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.