het schrijven van voltooiingsblokken met sluitingen in Swift

zelfs nadat ik een goed begrip had van het concept blokken, moest ik nog steeds hun syntaxis opzoeken elke keer dat ik iets anders wilde schrijven dan de eenvoudigste blokken (Dank u fuckingblocksyntax.com Swift ‘ s versie van blokken, bekend als sluitingen, nemen een veel schonere, meer natuurlijke benadering van de syntaxis. Dus zonder verder oponthoud, tijd om sluitingen te leren zoals mijn vader me leerde: door het schrijven van een completion block.

UIView ‘ s animation API is een van de meest voorkomende gebieden die iOS devs blokken gebruiken. Voordat u blindelings uw eigen methode schrijft, probeert u een van Apple ‘ s codevoorbeelden te gebruiken om vertrouwd te raken met de syntaxis. Hieronder is een Objective-C voorbeeld, en dan dezelfde code geschreven in Swift:

doelstelling C:

Swift:

tot grote ontzetting van konijnen en bijziende ontwikkelaars, zijn carets ( ^ ) (nog) nergens te vinden in Swift. Rust in vrede oude vriend, u bent vervangen door het trefwoord in. U gebruikt het trefwoord in als u klaar bent met het declareren van de parameters en de return waarden voor uw afsluiting. Dit zal zinvoller zijn als ik je laat zien wat autocomplete invulde zodra het wist welke methode Ik wilde:

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

focussen op deze syntaxis, wordt het duidelijk hoe de parameters en return waarden van een sluiting goed te schrijven:

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

in het Swift code voorbeeld hierboven, beide van de animatie sluitingen terug leegte, dus we konden de return type syntaxis allemaal samen te laten vallen. Daarom zie je alleen de ( ) voor de parameters. Merk op dat zelfs als er geen parameters zijn, zoals bij de eerste afsluiting, je die empty ( ) nog steeds nodig hebt voor het trefwoord in. Ze zijn nodig. Bolded zodat je het je herinnert.

Oké, laten we nu proberen onze eigen Swift methode te schrijven met een afronding. In de GitHub repository gekoppeld aan de onderkant van dit bericht, Ik heb gewerkt aan een GitHub client app in Swift met een team van code Fellows. In dit project hebben we een netwerk controller die alle asynchrone netwerk aanroepen naar Github API afhandelt.

laten we een methode schrijven die een lijst van gebruikers haalt uit een zoekopdracht op de client. Voor deze methode is een voltooiingsafsluiting nodig om de view Controller te laten weten wanneer de netwerkoproep is voltooid, en om een reeks Gebruikersmodellen te bieden om onze collectieweergave te vullen.

zo ziet de handtekening van de functie eruit:

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

we hebben hier twee parameters: een string type genaamd searchTerm en onze voltooiing sluiting. Zie je de syntaxis in de afsluitparameter? Eerst is de naam van onze Sluiting, dat is hoe we het later in de methode zullen noemen, dan de parameter (array van gebruikers), gevolgd door onze retourwaarde (void). Hieronder volgt een benadering van hoe het lichaam van deze methode eruit ziet:

 //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)

het noemen van onze voltooiing afsluiting in Swift is bijna dezelfde manier waarop we noemen ons voltooiing blok in Objective-C. Het heet net als elke andere functie, en we zorgen ervoor om door te gaan in een array als een parameter, omdat dat is hoe we gedefinieerd in onze functie handtekening. Ik heb met opzet alle netwerkcode weggelaten om dit bericht zo kort mogelijk te houden, maar voel je vrij om de GitHub repository te bekijken als je geïnteresseerd bent in hoe het werkt. We zijn van plan om een blog post op het netwerk in Swift in de nabije toekomst.

tot slot, laten we eens kijken hoe we deze methode zouden noemen vanuit onze SearchUsersViewController:

nog iets wat ik je wil laten opmerken is hoe ik addOperationWithBlock() op onze mainQueue()heb aangeroepen. Als een sluiting de laatste parameter van de handtekening van een functie is, kunt u speciale syntaxis gebruiken om het nog schoner te maken. Dit wordt aangeduid als een trailing sluiting. Trailing sluitingen worden geschreven direct na de () ’s van een functie aanroep. Hieronder is een functie call, eerst met een regelmatige sluiting, dan met een trailing sluiting.

het is een subtiel verschil, en beide manieren werken. Vergeet niet dat het de laatste parameter van de functie moet zijn om de syntaxis van de afsluiting te kunnen gebruiken.

nu moet u de basis syntaxis van sluitingen in Swift kennen. Bekijk de Swift-programmeertaal op iBooks voor meer geavanceerde informatie over sluitingen. Er staat een hele subsectie op. En hier is de link naar het GitHub client project.

er is ook al een Swift-tegenhanger voor fuckingblocksyntax.com je raadt het al, closuresyntax neuken.com dat is zeker de moeite waard toe te voegen aan uw bladwijzersbalk als je Swift leren.

goede dag.

klaar om een professionele ontwikkelaar te worden? Neem contact op ontdek hoe!

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.