skriva kompletteringsblock med stängningar i Swift

även efter att jag hade ett bra handtag på begreppet Block, var jag fortfarande tvungen att leta upp sin syntax varje gång jag ville skriva allt annat än det enklaste av block (tack fuckingblocksyntax.com). Swifts version av block, känd som stängningar, tar en mycket renare, mer naturlig inställning till syntax. Så utan vidare, dags att lära sig stängningar som min pappa lärde mig: genom att skriva ett slutförandeblock.

Uiviews animation API är ett av de vanligaste områdena som iOS devs använder block. Innan du blint skriver din egen metod, försök använda ett av Apples kodexempel för att bekanta dig med syntaxen. Nedan är ett Objective-C-exempel, och sedan samma kod skriven i Swift:

mål C:

Swift:

mycket till bestörtning av kaniner och närsynta Utvecklare, carets ( ^ ) finns ingenstans (ännu) i Swift. Vila i frid gammal vän, du har ersatts av nyckelordet in. Du använder nyckelordet in när du är klar med att deklarera parametrarna och returvärdena för din stängning. Detta kommer att vara mer meningsfullt om jag visar dig vilken autofullständig som fylldes i när den visste vilken metod jag ville ha:

UIView.animateWithDuration(duration: NSTimeInterval, animations: (() -> Void)?, completion: ((Bool) -> Void)?)

med fokus på denna syntax blir det tydligt hur man korrekt skriver parametrarna och returnerar värdena för en stängning:

{(parameters) -> (return type) in expression statements}

i Swift-kodexemplet ovan återvände båda animeringsstängningarna ogiltiga, så vi kunde släppa syntaxen för returtyp tillsammans. Det är därför du bara ser ( ) för parametrarna. Observera att även om det inte finns några parametrar, som i den första stängningen, behöver du fortfarande de tomma ( ) före nyckelordet in. De krävs. Fetstil så att du kommer ihåg det.

Okej, låt oss nu försöka skriva vår egen Swift-metod med en slutförslutning. I Github-förvaret länkat längst ner i det här inlägget har jag arbetat med en Github-klientapp i Swift med ett team av Kodkamrater. I det här projektet har vi en nätverkskontroller som hanterar alla asynkrona nätverksanrop till GitHubs API.

Låt oss skriva en metod som hämtar en lista över användare från en sökfråga på klienten. Den här metoden behöver en slutförslutning för att låta den begärande visningskontrollen veta när nätverkssamtalet är klart och tillhandahålla en rad Användarmodeller för att fylla i vår samlingsvy.

här är vad signaturen för funktionen skulle se ut:

func searchUsersWithSearchTerm(searchTerm: String, completionClosure: (users :User) ->()) 

vi har två parametrar här: en strängtyp som heter searchTerm och vår slutförande stängning. Lägg märke till syntaxen i stängningsparametern? Först är namnet på vår stängning, vilket är hur vi kommer att kalla det senare i metoden, sedan parametern (array of Users), följt av vårt returvärde (void). Nedan följer en approximation av hur kroppen av denna metod ser ut:

 //setup a NSMutableRequest with the correct API URL and parameters //setup a dataTask on our NSURLSession instance //once our datatask has successfully retrieved the data we wanted, and we have parsed through it to create an array of User Models, we call our completion closure like this: var users : User = //Parse the JSON data into Users completionClosure(users: users)

att ringa vår slutförslutning i Swift är nästan samma sätt som vi kallar vårt slutförandeblock i Objective-C. Det kallas precis som alla andra funktioner, och vi ser till att passera i en array som en parameter, eftersom det är så vi definierade det i vår funktionssignatur. Jag utelämnade medvetet all nätverkskod för att hålla det här inlägget så kort som jag kunde, men kolla gärna in Github-förvaret om du är intresserad av att se hur det fungerar. Vi planerar att ha ett blogginlägg på nätet i Swift inom en snar framtid.

slutligen kan vi ta en titt på hur vi skulle kalla den här metoden från vår SearchUsersViewController:

en sak jag vill att du märker är hur jag ringde addOperationWithBlock() på vår mainQueue(). Om en stängning är den sista parametern för en funktions signatur kan du använda speciell syntax för att göra den ännu renare. Detta kallas en avslutande stängning. Avslutande stängningar skrivs direkt efter () s av ett funktionsanrop. Nedan är ett funktionssamtal, först med en vanlig stängning, sedan med en efterföljande stängning.

det är en subtil skillnad, och båda sätten fungerar. Kom bara ihåg att det måste vara den sista parametern för funktionen för att kunna använda den efterföljande stängningssyntaxen.

nu borde du veta den grundläggande syntaxen för stängningar i Swift. För några mer avancerade nivå saker på nedläggningar, kolla in Swift programmeringsspråk på iBooks. Den har en hel underavdelning på dem. Och här är länken till github-klientprojektet.

det finns också redan en snabb motsvarighet till fuckingblocksyntax.com ringde, du gissade det, fuckingclosuresyntax.com som är definitivt värt att lägga till i bokmärkesfältet när du lär dig Swift.

God dag.

redo att bli en professionell utvecklare? Ta kontakt ta reda på hur!

Lämna ett svar

Din e-postadress kommer inte publiceras.