děláme hodně asynchronní práce na mobilních zařízeních ve snaze zabránit tomu, aby náš kód blokoval hlavní vlákno. Dříve to znamenalo mnoho delegátových metod, ale novější pokroky v Objective-C nám umožnily vrátit hodnoty do bloků jako obslužné rutiny dokončení. Není pochyb o tom, že to budeme muset udělat hodně také ve Swiftu.

zde je definice funkce z Objective-C, která využívá vzor bloku dokončení a přidruženou syntaxi k jeho použití:

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

díky kurva blok syntaxe! Nikdy si nepamatuji tyto věci ani

Swift má nějakou příležitost zlepšit to, protože to nemusí být nějaký dodatečný doplněk jazyka, může být pečený od samého začátku.

výsledek může vypadat složitě (jako všechny deklarace funkce ve funkci), ale je opravdu jednoduchý. Je to jen definice funkce, která bere funkci jako argument, takže pokud rozumíte vnoření, mělo by se to rychle vyjasnit:

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

uzavření Dokončení je zde pouze funkce, která vezme řetězec a vrátí neplatnost. Zpočátku to zní pozpátku-to bere řetězec jako argument ? Chceme vrátit řetězec! – ale opravdu nechceme vrátit řetězec, to by znamenalo, že jsme zablokovali, dokud se nevrátíme. Místo toho voláme funkci, kterou nám dal volající, a poskytneme jim související argumenty.

použití obslužných rutin dokončení je jednodušší, než je deklarovat, a to díky chytrému způsobu, jak zkrátit volání funkcí od týmu swift:

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

Toto je koncové uzavření, něco, co můžeme použít, kdykoli je posledním argumentem uzavření. Pomocí poněkud podivné syntaxe {() in } máme magicky výsledky, které jsme uzavřeli zpět v naší asynchronní funkci. Opravdu ještě musím proniknout do hloubky swift, abych pochopil, co dělá tuto syntaxi klíště, ale prozatím jsem rád, že to funguje.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.