Skrive fullføringsblokker Med lukninger I Swift

Selv Etter at jeg hadde et godt håndtak på begrepet blokker, måtte jeg fortsatt slå opp syntaksen hver gang jeg ønsket å skrive noe annet enn det enkleste av blokker (takk fuckingblocksyntax.com). Swifts versjon av blokker, kjent som nedleggelser, tar en mye renere, mer naturlig tilnærming til syntaks. Så uten videre, tid til å lære nedleggelser slik min far lærte meg: ved å skrive en fullføringsblokk.

uiviews animasjons-API er et av de vanligste områdene som iOS-utviklere bruker blokker. Før du blindt skriver din egen metode, prøv å bruke En Av Apples kodeeksempler for å gjøre deg kjent med syntaksen. Nedenfor er Et Objective – c-eksempel, og deretter den samme koden skrevet I Swift:

Objective C:

Swift:

mye til forferdelse for kaniner og nærsynte utviklere, carets ( ^ ) er ingensteds å bli funnet (ennå) I Swift. Hvil i fred gamle venn, du har blitt erstattet av søkeordet in. Du bruker søkeordet in når du er ferdig med å erklære parametrene og returverdiene for lukkingen. Dette vil være mer fornuftig hvis jeg viser deg hva autofullfør fylt ut når det visste hvilken metode jeg ønsket:

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

Med Fokus på denne syntaksen blir det klart hvordan du skal skrive parametrene og returnere verdiene til en lukning:

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

I Swift-kodeeksemplet ovenfor returnerte begge animasjonslukningene ugyldig, slik at vi kunne slippe returtypesyntaksen sammen. Det er derfor du bare ser () for parametrene. Legg merke til at selv om det ikke er noen parametere, som i den første lukkingen, trenger du fortsatt de tomme ( ) før søkeordet in. De er påkrevd. Bolded slik at du husker det.

Ok, la oss nå prøve å skrive vår Egen Swift-metode med fullføring. I Github-depotet koblet nederst i dette innlegget har jeg jobbet med En Github-klientapp i Swift med Et team Av Kodekammerater. I dette prosjektet har vi en nettverkskontroller som håndterer alle asynkrone nettverkskall til Github API.

la oss skrive en metode som henter en liste over brukere fra et søk på klienten. Denne metoden trenger en avsluttende avslutning for å la Den forespurte Visningskontrolleren vite når nettverksanropet er ferdig, og gi en rekke brukermodeller for å fylle ut samlingsvisningen.

her er hva signaturen til funksjonen vil se ut:

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

Vi har to parametere her: en streng type kalt searchTerm og vår ferdigstillelse nedleggelse. Legg merke til syntaksen i lukkeparameteren? Først er navnet på vår nedleggelse, som er hvordan vi vil kalle det senere i metoden, deretter parameteren (array Of Users), etterfulgt av vår returverdi (void). Nedenfor er en tilnærming av hva kroppen av denne metoden 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)

Å Kalle vår fullføringslukking I Swift er nesten på samme måte som vi kaller vår fullføringsblokk I Objective-C. Det kalles akkurat som enhver annen funksjon, og vi sørger for å passere i en matrise som en parameter, siden det er slik vi definerte det opp i vår funksjonssignatur. Jeg har med vilje utelatt all nettverkskoden for å holde dette innlegget så kort som mulig, men vær så snill å sjekke Ut Github-depotet hvis du er interessert i å se hvordan det fungerer. Vi planlegger å ha et blogginnlegg på network I Swift i nær fremtid.

Til Slutt, la oss ta en titt på hvordan vi vil kalle denne metoden fra Vår SearchUsersViewController:

En ting jeg vil du legge merke til er hvordan jeg ringte addOperationWithBlock() på vår mainQueue(). Hvis en lukking er den siste parameteren i signaturen til en funksjon, kan du bruke spesiell syntaks for å gjøre den enda renere. Dette er referert til som en etterfølgende nedleggelse. Etterfølgende nedleggelser er skrevet direkte etter () ‘ s av et funksjonskall. Nedenfor er et funksjonskall, først med vanlig lukning, deretter med en etterfølgende lukning.

Det er en subtil forskjell, og begge veier fungerer. Bare husk at det må være den siste parameteren til funksjonen for å kunne bruke etterfølgende luknings syntaks.

Nå bør du vite grunnleggende syntaks av nedleggelser I Swift. For noen mer avanserte nivå ting på nedleggelser, sjekk Ut Swift Programmeringsspråk på iBooks. Den har et helt underavsnitt på dem. Her er link til github client project.

Det er også Allerede En Swift motstykke til fuckingblocksyntax.com kalt, du gjettet det, knullingclosuresyntax.com det er definitivt verdt å legge til bokmerkelinjen når Du lærer Swift.

God dag.

Klar Til å bli en profesjonell utvikler? Ta kontakt finn ut hvordan!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.