Vi gjør mye asynkront arbeid på mobile enheter i et forsøk på å holde koden vår fra å blokkere hovedtråden. Tidligere betydde det mange delegeringsmetoder, men nyere fremskritt i Objective-C tillot oss å returnere verdier til blokker som ferdigstillingsbehandlere. Det må vi også gjøre mye av i swift.

her er en funksjonsdefinisjon Fra Objective-C som bruker fullføringsblokkmønsteret og tilhørende syntaks for å bruke Det:

- (void)hardProcessingWithString:(NSString *)input withCompletion:(void (^)(NSString *result))block;;

Takk Jævla Blokk Syntaks! Jeg kan aldri huske disse tingene enten

Swift får mulighet til å forbedre dette siden Det ikke trenger å være noe ettertanke språk tillegg, det kan bli bakt inn fra begynnelsen.

resultatet kan se komplisert ut (som alle funksjoner-i-funksjon-deklarasjoner gjør), men er veldig enkelt. Det er bare en funksjonsdefinisjon som tar en funksjon som et argument, så lenge du forstår nesting, bør dette raskt bli klart:

func hardProcessingWithString(input: String, completion: (result: String) -> Void) {...completion("we finished!")}

fullføringslukningen her er bare en funksjon som tar en streng og returnerer ugyldig. Først høres dette bakover – dette tar en streng som et argument ? Vi ønsker å returnere en streng! – men vi ønsker ikke å returnere en streng, det ville bety at vi har blokkert til vi kommer tilbake. I stedet kaller vi en funksjon som callee har gitt oss og gir dem de tilknyttede argumentene.

Det er enklere å bruke fullføringsbehandlere enn å erklære dem, takket være en smart måte å forkorte funksjonssamtaler fra swift-teamet:

hardProcessingWithString("commands") {(result: String) inprint("got back: \(result)")}

Dette er en etterfølgende lukning, noe vi kan bruke når det siste argumentet er en lukning. Ved å bruke den noe merkelige {() in } syntaksen, har vi magisk resultatene som vi passerte lukkingen tilbake i vår async-funksjon. Jeg har ennå ikke plumb dybden av swift for å forstå hva som gjør denne syntaksen tick, men for nå er jeg glad for at det fungerer.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.