sok aszinkron munkát végzünk mobil eszközökön annak érdekében, hogy a kódunk ne blokkolja a fő szálat. Korábban ez sok delegált módszert jelentett, de az Objective-C újabb előrelépései lehetővé tették számunkra, hogy az értékeket a blokkoknak mint befejezési kezelőknek adjuk vissza. Nem kétséges, hogy a swift-ben is sok mindent meg kell tennünk.

itt található az Objective-C függvénydefiníciója, amely a befejezési blokkmintát és a hozzá tartozó szintaxist használja annak használatához:

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

köszönöm kibaszott blokk szintaxis! Soha nem emlékszem erre a cuccra

a Swift lehetőséget kap arra, hogy javítsa ezt, mivel nem kell valamilyen utólagos nyelvi kiegészítésnek lennie, a kezdetektől fogva süthető.

az eredmény bonyolultnak tűnhet (mint minden funkció a funkcióban deklaráció), de nagyon egyszerű. Ez csak egy függvénydefiníció, amely egy függvényt argumentumként vesz fel, így mindaddig, amíg megérti a fészkelést, ennek gyorsan világossá kell válnia:

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

a Befejezés lezárása itt csak egy függvény, amely egy karakterláncot vesz fel, és érvénytelen értéket ad vissza. Eleinte ez visszafelé hangzik – ez egy karakterláncot vesz fel érvként? Vissza akarunk adni egy húrot! – de nem igazán akarunk visszaadni egy húrt, az azt jelentené, hogy blokkoltuk, amíg vissza nem térünk. Ehelyett egy függvényt hívunk meg, amelyet a hívott adott nekünk, és megadjuk nekik a kapcsolódó argumentumokat.

a befejezési kezelőket könnyebb használni, mint deklarálni őket, köszönhetően a swift csapat funkcióhívásainak lerövidítésének okos módjának:

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

ez egy záró lezárás, amit akkor használhatunk, amikor az utolsó érv lezárás. A kissé furcsa {() in } szintaxist használva varázslatosan megkapjuk az eredményeket, hogy az aszinkron függvényben visszaadtuk a bezárást. Tényleg még meg kell mélyítenem a swift mélységét, hogy megértsem, mi teszi ezt a szintaxist, de most örülök, hogy működik.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.