skrivning af færdiggørelsesblokke med lukninger i hurtig

selv efter at jeg havde et godt greb om begrebet blokke, var jeg stadig nødt til at slå deres syntaks op hver gang jeg ville skrive alt andet end det enkleste af blokke (tak fuckingblocksyntax.com). hurtig version af blokke, kendt som lukninger, tage en meget renere, mere naturlig tilgang til syntaks. Så uden videre, tid til at lære lukninger, som min far lærte mig: ved at skrive en færdiggørelsesblok.

animations API er et af de mest almindelige områder, som iOS-devs bruger blokke. Før du blindt skriver din egen metode, kan du prøve at bruge en af Apples kodeprøver til at gøre dig bekendt med syntaksen. Nedenfor er et mål-C eksempel, og derefter den samme kode skrevet i hurtig:

Mål C:

hurtig:

meget til forfærdelse for kaniner og nærsynede udviklere er carets ( ^ ) intetsteds at finde (endnu) i hurtig. Hvil i fred gammel ven, du er blevet erstattet af nøgleordet in. Du bruger nøgleordet in, når du er færdig med at erklære parametrene og returværdierne for din lukning. Dette vil give mere mening, hvis jeg viser dig, hvilken autofuldførelse udfyldt, når den vidste, hvilken metode jeg ønskede:

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

med fokus på denne syntaks bliver det klart, hvordan man korrekt skriver parametrene og returværdierne for en lukning:

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

i eksemplet med hurtig kode ovenfor returnerede begge animationslukninger ugyldige, så vi kunne droppe syntaksen for returtype alle sammen. Derfor ser du kun () for parametrene. Bemærk, at selvom der ikke er nogen parametre, som i den første Lukning, har du stadig brug for de tomme ( ) før nøgleordet in. De er påkrævet. Fed, så du husker det.

Okay, lad os nu prøve at skrive vores egen hurtige metode med en afslutning lukning. I Github repository forbundet i bunden af dette indlæg, Jeg har arbejdet på en Github klient app i hurtig med et team af kode stipendiater. I dette projekt har vi en netværkscontroller, der håndterer alle de asynkrone netværksopkald til Githubs API.

lad os skrive en metode, der henter en liste over brugere fra en søgeforespørgsel på klienten. Denne metode har brug for en afslutning lukning for at lade den anmodende Visningskontroller vide, hvornår netværksopkaldet er afsluttet, og give en række Brugermodeller til at udfylde vores indsamlingsvisning.

her er hvad signaturen af funktionen ville se ud:

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

vi har to parametre her: en strengtype kaldet searchTerm og vores afslutning lukning. Bemærk syntaksen i lukningsparameteren? Først er navnet på vores lukning, hvilket er, hvordan vi vil kalde det senere i metoden, derefter parameteren (array of Users), efterfulgt af vores returværdi (ugyldig). Nedenfor er en tilnærmelse af, hvordan kroppen af denne metode ser ud:

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

at kalde vores færdiggørelseslukning hurtigt er næsten på samme måde, som vi kalder vores færdiggørelsesblok i Objective-C. Det kaldes ligesom enhver anden funktion, og vi sørger for at videregive et array som en parameter, da det er sådan, vi definerede det i vores funktionssignatur. Jeg udeladte med vilje al netværkskoden for at holde dette indlæg så kort som jeg kunne, men du er velkommen til at tjekke Github-depotet, hvis du er interesseret i at se, hvordan det fungerer. Vi planlægger at have et blogindlæg på netværket hurtigt i den nærmeste fremtid.

lad os endelig se på, hvordan vi ville kalde denne metode fra vores Searchusersvisecontroller:

en ting mere, Jeg vil have dig til at bemærke, er, hvordan jeg kaldte addOperationWithBlock()på vores mainQueue(). Hvis en lukning er den sidste parameter i en funktions signatur, kan du bruge speciel syntaks for at gøre den endnu mere ren. Dette kaldes en efterfølgende lukning. Efterfølgende lukninger skrives direkte efter () ‘ s af et funktionsopkald. Nedenfor er et funktionsopkald, først med en regelmæssig lukning, derefter med en efterfølgende lukning.

det er en subtil forskel, og begge måder fungerer. Bare husk, at det skal være den sidste parameter i funktionen for at bruge den efterfølgende lukningssyntaks.

nu skal du kende den grundlæggende syntaks af lukninger i hurtig. For nogle mere avancerede ting på lukninger, tjek det hurtige programmeringssprog på iBooks. Det har et helt underafsnit på dem. Her er linket til GitHub client project.

der er også allerede en hurtig modstykke til fuckingblocksyntax.com kaldte, du gættede det, fuckinglosuresyntaks.com, der bestemt er værd at tilføje til din bogmærkelinje, når du lærer hurtigt.

god dag.

klar til at blive en professionel udvikler? Kom i kontakt find ud af hvordan!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.