vi gör mycket asynkront arbete på mobila enheter i ett försök att förhindra att vår kod blockerar huvudtråden. Tidigare innebar det många delegeringsmetoder men senare framsteg i Objective-C gjorde det möjligt för oss att returnera värden till block som slutförandehanterare. Utan tvekan måste vi också göra mycket av detta i swift.

här är en funktionsdefinition från Objective-C som använder sig av kompletteringsblockmönstret och tillhörande syntax för att använda den:

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

tack jävla Block Syntax! Jag kan aldrig komma ihåg det här heller

Swift ges en viss möjlighet att förbättra detta eftersom det inte behöver vara något eftertanke språktillägg, det kan bakas in från början.

resultatet kan se komplicerat ut (som alla funktioner-i-funktion-deklarationer gör) men är väldigt enkelt. Det är bara en funktionsdefinition som tar en funktion som ett argument så länge du förstår att häcka bör detta snabbt bli klart:

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

avslutningsstängningen här är bara en funktion som tar en sträng och returnerar tomrum. Först låter detta bakåt-det tar en sträng som ett argument? Vi vill returnera en sträng! – men vi vill inte returnera en sträng, det skulle innebära att vi har blockerat tills vi återvänder. Istället kallar vi en funktion som callee har gett oss och ger dem de tillhörande argumenten.

att använda kompletteringshanterare är dock enklare än att förklara dem tack vare ett smart sätt att förkorta funktionssamtal från swift-teamet:

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

detta är en avslutande stängning, något vi kan använda när det sista argumentet är en stängning. Med hjälp av den något konstiga {() in } syntaxen har vi magiskt de resultat som vi passerade Stängningen tillbaka i vår async-funktion. Jag har verkligen ännu inte plumb djupet av swift för att förstå vad som gör denna syntax tick, men för nu är jag glad att det fungerar.

Lämna ett svar

Din e-postadress kommer inte publiceras.